wake-up-neo.com

AlertDialog: Entfernen von schwarzen Rahmen oberhalb und unterhalb der Ansicht

Diese Frage wurde zuvor gestellt: AlertDialog-benutzerdefinierter Titel hat schwarzen Rand

Wurde aber nicht zufriedenstellend beantwortet - und es fehlen einige Informationen.


Ich versuche, ein benutzerdefiniertes Dialogfeld in Android ohne Titel und ohne Schaltflächen am unteren Rand zu erstellen.

Der resultierende Dialog hat jedoch schwarze "Ränder"/"Abstand"/etwas oben und unten in der Ansicht.

Aus der Dokumentation

Ein mit der Basis-Dialogklasse erstelltes Dialogfeld muss einen Titel haben. Wenn du Rufen Sie nicht setTitle () auf, dann bleibt der Platz für den Titel leer, aber immer noch sichtbar. Wenn Sie überhaupt keinen Titel wünschen, dann sollte ein benutzerdefiniertes Dialogfeld mit der AlertDialog-Klasse erstellen. Jedoch, weil ein AlertDialog am einfachsten mit dem AlertDialog.Builder .__ erstellt wird. Klasse haben Sie keinen Zugriff auf die verwendete setContentView (int) -Methode über. Stattdessen müssen Sie setView (View) verwenden. Diese Methode akzeptiert eine View Objekt, also müssen Sie das Root-View-Objekt des Layouts aus XML aufpumpen.

Also habe ich das gemacht:

Welcome.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();
    }
}

welcomedialog.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>

HINWEIS: Ich habe versucht, FrameLayout als Wurzel ViewGroup anstelle von LinearLayout als Vorschlag zu verwenden, den ich irgendwo gefunden habe - aber das half nicht. 

Ergebnis

enter image description hereenter image description here


setBackgroundDrawable-Vorschlag

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();
    }
}

Hat nicht für mich gearbeitet.

31
Steve

Wenn Sie sich die Quelle der AlertDialog-Klasse ansehen sehen Sie, dass die meisten Methoden einfach Proxy-Methoden (Fassade) um private AlertController mAlert sind.

In der AlertController-Klassenquelle sehen Sie 4 interessante Member-Variablen: 

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

Wenn Sie mViewSpacingSpecified auf true setzen, werden die Ränder oben und unten im Dialogfeld entfernt. 

Dies geschieht ordnungsgemäß, indem Sie diese Zeile ändern: 

dialog.setView(layout);

zu:

dialog.setView(layout, 0, 0, 0, 0);
39
Steve
dialog.setInverseBackgroundForced(true);

verwenden Sie das Obige in Ihrem Code, um den Rand des Alarmdialogfelds zu entfernen.

Verweisen Sie auf dieses LINK für InverseBackgroundForced.

AKTUALISIERT Probieren Sie diesen Code aus ::::

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();
    }
}

Note :: Versuchen Sie auch, Android zu entfernen: padding = "40px" aus der Datei "welcomedialog.xml".

8
Shankar Agarwal

In meinem Fall wurde diese Grenze durch das Thema der übergeordneten Aktivität für den AlertDialog verursacht. Um die Grenze vollständig zu entfernen, geben Sie ein anderes Thema an (in diesem Fall Holo):

AlertDialog.Builder builder = new AlertDialog.Builder(
                                new ContextThemeWrapper(this, Android.R.style.Theme_Holo)
                              );

Das hat es für mich behoben. Hoffe das hilft!

6
Prismatica

Nur um Steve's Antwort klarer zu machen, kann dies leicht gemacht werden. In meinem Fall war die Ansicht, die ich im Dialog eingestellt hatte, zum Beispiel eine WebView.

@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
jsidera
setBackgroundDrawable(new ColorDrawable(0));

Rufen Sie dies in Ihrem Dialog auf.

0
Changwei Yao