AlertDialog: jak usunąć czarne obramowania powyżej i poniżej widoku

To pytanie zostało już zadane: AlertDialog custom title has black border

Ale nie odpowiedział zadowalająco - i brakuje pewnych informacji.


Próbuję utworzyć niestandardowe okno dialogowe w Androidzie bez tytułu i bez żadnych przycisków na dole.

Jednak powstałe okno dialogowe ma czarne "obramowania" / "odstępy" / coś wzdłuż górnej i dolnej części widoku.

From the Documentation :

Okno dialogowe wykonane z podstawowej klasy dialogowej musi mieć tytuł. Jeśli nie wywołaj setTitle (), wtedy przestrzeń użyta dla tytułu pozostaje pusty, ale wciąż widoczny. Jeśli w ogóle nie chcesz tytułu, to należy utworzyć własne okno dialogowe przy użyciu klasy AlertDialog. Jednakże, ponieważ AlertDialog jest tworzony najłatwiej z AlertDialog.Budowniczy klasy, nie masz dostępu do użytej metody setContentView (int) powyżej. Zamiast tego musisz użyć setView (Widok). Ta metoda akceptuje Widok obiekt, więc musisz napompować Główny obiekt widoku układu z XML.

Więc tak zrobiłem:

Witam.java

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(layout);
        builder.create().show();
    }
}

/ align = "left" / xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/texturebg"
              android:id="@+id/layout_root"
              android:orientation="vertical"
              android:padding="40px">
    ...
</LinearLayout>

Uwaga: próbowałem użyć FrameLayout jako root ViewGroup zamiast LinearLayout zgodnie z sugestią, którą gdzieś znalazłem - ale to nie pomogło.

Wynik

Tutaj wpisz opis obrazkaTutaj wpisz opis obrazka


SetBackgroundDrawable Suggestion

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(layout);
        AlertDialog dialog = builder.create();

        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));

        dialog.show();
    }
}
Nie zadziałało na mnie.
Author: Community, 2012-05-03

5 answers

Jeśli spojrzysz na źródło klasy AlertDialog zobaczysz, że większość metod to po prostu metody proxy (fasada) wokół private AlertController mAlert.

Patrząc na źródło klasy AlertController zobaczysz 4 interesujące zmienne członkowskie:

private int mViewSpacingLeft;
private int mViewSpacingTop;
private int mViewSpacingRight;
private int mViewSpacingBottom;
private boolean mViewSpacingSpecified = false;

Ustawienie mViewSpacingSpecified na true spowoduje usunięcie obramowania na górze i na dole okna dialogowego.

Jest to zrobione poprawnie przez zmianę tej linii:

dialog.setView(layout);

Do:

dialog.setView(layout, 0, 0, 0, 0);
 39
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 08:09:00
dialog.setInverseBackgroundForced(true);

Użyj powyższego kodu, aby usunąć obramowanie okna dialogowego alertu.

Zobacz ten LINK dla InverseBackgroundForced.

Zaktualizowano wypróbuj ten kod::::

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        AlertDialog.Builder builder = new AlertDialog.Builder(Welcome.this);
        LayoutInflater _inflater = LayoutInflater.from(Welcome.this);
        View view = _inflater.inflate(R.layout.welcomedialog,null);
        builder.setView(view);

        AlertDialog alert = builder.create();
        alert.show();
    }
}

Uwaga:: Spróbuj również usunąć android: padding= "40px" z welcomedialog.xml.

 8
Author: Shankar Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-12 03:27:01

W moim przypadku ta granica była spowodowana motywem aktywności rodzica dla AlertDialog. Aby całkowicie pozbyć się granicy, nadaj jej inny temat (w tym przypadku Holo):

AlertDialog.Builder builder = new AlertDialog.Builder(
                                new ContextThemeWrapper(this, android.R.style.Theme_Holo)
                              );
To mi to naprawiło. Mam nadzieję, że to pomoże!
 6
Author: Prismatica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 22:28:36

Żeby odpowiedź Steve ' a była bardziej jasna, można to łatwo zrobić. Na przykład w moim przypadku widok, który ustawiałem w oknie dialogowym, był widokiem sieciowym.

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    WebView webView = new WebView(getActivity());
    webView.loadUrl(" url to show ");


    OnClickListener clickListenerOk = new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            ...
        }
    };

    OnClickListener clickListenerCancel = new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            ...
        }
    };

    AlertDialog dialog = new AlertDialog.Builder(getActivity())

            .setPositiveButton("OK", clickListenerOk)

            .setNegativeButton("Cancel",clickListenerCancel)

            .create();

    dialog.setView(webView, 0, 0, 0, 0);

    return dialog;
}
 1
Author: jsidera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 07:54:49
setBackgroundDrawable(new ColorDrawable(0));

Zadzwoń do tego w oknie dialogowym.

 0
Author: Changwei Yao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 14:48:09