In den Android-Dokumenten zu AlertDialog finden Sie die folgenden Anweisungen und Beispiele zum Festlegen einer benutzerdefinierten Ansicht in einem AlertDialog:
Wenn Sie eine komplexere Ansicht anzeigen möchten, rufen Sie das FrameLayout mit dem Namen "body" auf und fügen Sie Ihre Ansicht hinzu:
FrameLayout fl = (FrameLayout) findViewById(R.id.body);
fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));
Zunächst einmal ist es ziemlich offensichtlich, dass dies add()
ein Tippfehler ist und sein soll addView()
.
Ich bin durch die erste Zeile mit R.id.body verwirrt. Es scheint, dass es das Body-Element des AlertDialogs ist ... aber ich kann nicht einfach eingeben, dass es in meinem Code b / c einen Kompilierungsfehler gibt. Wo wird R.id.body definiert oder zugewiesen oder was auch immer?
Hier ist mein Code. Ich habe versucht, setView(findViewById(R.layout.whatever)
den Builder zu verwenden, aber es hat nicht funktioniert. Ich nehme an, weil ich es nicht manuell aufgeblasen habe?
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title")
.setCancelable(false)
.setPositiveButton("Go", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText textBox = (EditText) findViewById(R.id.textbox);
doStuff();
}
});
FrameLayout f1 = (FrameLayout)findViewById(R.id.body /*CURRENTLY an ERROR*/);
f1.addView(findViewById(R.layout.dialog_view));
AlertDialog alert = builder.create();
alert.show();
android
android-alertdialog
stormin986
quelle
quelle
.setView(getLayoutInflater().inflate(R.layout.dialog_view, null))
Zum Builder hinzufügen . Dank an Sergio Viudes, unten.Antworten:
Sie haben Recht, weil Sie es nicht manuell aufgeblasen haben. Es scheint, dass Sie versuchen, die "body" -ID aus dem Layout Ihrer Aktivität zu "extrahieren", und das funktioniert nicht.
Sie möchten wahrscheinlich so etwas:
quelle
builder.setView(inflater.inflate(R.id.dialog, ROOT_VIEWGROUP[, ATTACH_TO_ROOT]))
den Dokumenten wird angegeben, dass die Stammansichtsgruppe optional ist. Sollte dies in diesem Fall verwendet werden? Wenn ja ... müssen Sie noch herausfinden, wie Sie einen Verweis auf den AlertDialog erhalten ...View
Sie aufblasen. Rufen Sie dasfindViewById()
an,View
wenn Sie Inhalte benötigen. Siehe: github.com/commonsguy/cw-android/tree/master/Database/ConstantsSie können Ihre Ansicht direkt aus dem Layout Inflater erstellen. Sie müssen nur den Namen Ihrer Layout-XML-Datei und die ID des Layouts in der Datei verwenden.
Ihre XML-Datei sollte eine folgende ID haben:
Anschließend können Sie Ihr Layout im Builder mit dem folgenden Code festlegen:
quelle
getCurrentFocus()
der EditText zurückgegeben wird und ein EditText nicht in eine ViewGroup umgewandelt werden kann. Die Verwendungnull
als zweites Argument behebt dies.android.R.id.custom hat für mich null zurückgegeben. Ich habe es geschafft, dass dies funktioniert, falls jemand auf dasselbe Problem stößt.
Als Referenz lautet R.layout.simple_password:
quelle
FrameLayout
als eine Art Fragment? Als ich die obige Antwort von Andrewx2 ausprobierte, bekam ich einen Fehler, weil ich dachte, ich würde zwei Layouts aufblasen (ist meine Vermutung).Die Android-Dokumente wurden bearbeitet, um die Fehler zu korrigieren.
Die Ansicht im AlertDialog wird aufgerufen
android.R.id.custom
http://developer.android.com/reference/android/app/AlertDialog.html
quelle
Das hat bei mir funktioniert:
quelle
Benutzerdefinierter AlertDialog
Dieses vollständige Beispiel umfasst die Rückgabe von Daten an die Aktivität.
Erstellen Sie ein benutzerdefiniertes Layout
EditText
Für dieses einfache Beispiel wird ein Layout mit einem verwendet, das Sie jedoch durch ein beliebiges ersetzen können.custom_layout.xml
Verwenden Sie den Dialog im Code
Die wichtigsten Teile sind
setView
, um das benutzerdefinierte Layout dem zuzuweisenAlertDialog.Builder
Dies ist der vollständige Code aus dem im obigen Bild gezeigten Beispielprojekt:
MainActivity.java
Anmerkungen
DialogFragment
Unterklasse erstellen, wie in der Dokumentation beschrieben .Siehe auch
quelle
EditText editText = customLayout.findViewById(R.id.editText);
sollte seinEditText editText = (EditText) customLayout.findViewById(R.id.editText);
Die einfachsten Codezeilen, die für mich funktionieren, sind folgende:
Unabhängig von der Art des Layouts (LinearLayout, FrameLayout, RelativeLayout) funktioniert es
setView
und unterscheidet sich nur in Aussehen und Verhalten.quelle
Der einfachste Weg , dies zu tun ist , indem Sie
android.support.v7.app.AlertDialog
statt ,android.app.AlertDialog
wopublic AlertDialog.Builder setView (int layoutResId)
kann unter API 21 verwendet werden.quelle
AlertDialog.setView(View view)
fügt die angegebene Ansicht zum hinzuR.id.custom FrameLayout
. Das Folgende ist ein Ausschnitt aus dem Android-Quellcode, ausAlertController.setupView()
dem dies schließlich behandelt wird (mView
ist die Ansicht, die derAlertDialog.setView
Methode gegeben wurde).quelle
Nachdem ich die ID it android.R.id.custom geändert hatte, musste ich Folgendes hinzufügen, damit die Ansicht angezeigt wurde:
Dies führte jedoch dazu, dass die neue Ansicht in einer großen übergeordneten Ansicht ohne Hintergrund gerendert wurde, wodurch das Dialogfeld in zwei Teile aufgeteilt wurde (Text und Schaltflächen, dazwischen die neue Ansicht). Ich habe endlich den gewünschten Effekt erzielt, indem ich meine Ansicht neben die Nachricht eingefügt habe:
Ich habe diese Lösung gefunden, indem ich den Ansichtsbaum mit View.getParent () und View.getChildAt (int) untersucht habe. Aber auch nicht wirklich glücklich darüber. Nichts davon ist in den Android-Dokumenten enthalten. Wenn sie jemals die Struktur des AlertDialogs ändern, kann dies zu Problemen führen.
quelle
Es wäre am sinnvollsten, dies auf diese Weise zu tun, am wenigsten Code.
Beginnen Sie mit der Eingabe
.set
in Android Studio , um eine erweiterte Liste der Einstellungen zu erhaltenquelle