AlertDialog.Builder mit benutzerdefiniertem Layout und EditText; kann nicht auf die Ansicht zugreifen

100

Ich versuche, einen Warndialog mit einem EditTextObjekt zu erstellen . Ich muss den Anfangstext des EditTextprogrammgesteuert einstellen . Hier ist was ich habe.

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
AlertDialog alertDialog = dialogBuilder.create();
LayoutInflater inflater = this.getLayoutInflater();
alertDialog.setContentView(inflater.inflate(R.layout.alert_label_editor, null));
EditText editText = (EditText) findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();

Was muss ich ändern, damit ich ein gültiges EditTextObjekt haben kann?

[bearbeiten]

Daher wurde von user370305 und anderen darauf hingewiesen, dass ich verwenden sollte alertDialog.findViewById(R.id.label_field);

Leider gibt es hier ein anderes Problem. Anscheinend führt das Festlegen der Inhaltsansicht auf AlertDialogzum Absturz des Programms zur Laufzeit. Sie müssen es auf dem Builder einstellen.

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));
AlertDialog alertDialog = dialogBuilder.create();
LayoutInflater inflater = this.getLayoutInflater();
EditText editText = (EditText) alertDialog.findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();

Wenn Sie dies tun, alertDialog.findViewById(R.id.label_field);kehren Sie jetzt leider zurück null.

[/bearbeiten]

Don Subert
quelle

Antworten:

236

editTextist ein Teil des alertDialogLayouts, also einfach editTextmit Bezug auf zugreifenalertDialog

EditText editText = (EditText) alertDialog.findViewById(R.id.label_field);

Aktualisieren:

Weil in der Codezeile dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));

inflaterist Null .

Aktualisieren Sie Ihren Code wie unten beschrieben und versuchen Sie, die einzelnen Codezeilen zu verstehen

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.alert_label_editor, null);
dialogBuilder.setView(dialogView);

EditText editText = (EditText) dialogView.findViewById(R.id.label_field);
editText.setText("test label");
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.show();

Update 2:

Wie Sie View - Objekt von Inflater zu aktualisieren UI - Komponenten sonst erstellt verwenden , können Sie direkt verwenden setView(int layourResId)Methode der AlertDialog.BuilderKlasse, die von API 21 und weiter zur Verfügung steht.

user370305
quelle
22
Sie können es auch tun als:dialogBuilder.setView(R.layout.dialog_layout);
SiavA
4
@SiavA diese Methode ist nur von API 21 verfügbar.
Scaraux
Ich habe versucht, Dialog anzuzeigen, und es hat in RecyclerView nicht funktioniert, aber dieser hat funktioniert.
Muneeb Mirza
Sie können verwenden, getLayoutInflater()wenn das inflaternicht definiert ist.
BackslashN
1
@saigopi Wenn Sie onClick überschreiben, gibt es Argumente (DialogInterface dialog, int id). Übergeben Sie in dieser onClick-Methode einfach dialog.cancel ();
Minkoo
28

Verwende das hier

   AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    // Get the layout inflater
    LayoutInflater inflater = (activity).getLayoutInflater();
    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the
    // dialog layout
    builder.setTitle(title);
    builder.setCancelable(false);
    builder.setIcon(R.drawable.galleryalart);
    builder.setView(inflater.inflate(R.layout.dialogue, null))
    // Add action buttons
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {

                    }
                }
            });
    builder.create();
    builder.show();
Naveen Kumar
quelle
sollte sein builder.create().show();, können Sie den builder.show();Code für weitere Details überprüfen
Phan Van Linh
9

Du kannst schreiben:

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);

 // ...Irrelevant code for customizing the buttons and title

LayoutInflater inflater = this.getLayoutInflater(); 

View dialogView= inflater.inflate(R.layout.alert_label_editor, null);                    
dialogBuilder.setView(dialogView);

Button button = (Button)dialogView.findViewById(R.id.btnName);

   button.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {

         //Commond here......

       }
   });

EditText editText = (EditText)
dialogView.findViewById(R.id.label_field); 

editText.setText("test label"); 

dialogBuilder.create().show();
Sumit Saxena
quelle
3

Falls es jemand in Kotlin will:

val dialogBuilder = AlertDialog.Builder(this)
// ...Irrelevant code for customizing the buttons and title
val dialogView = layoutInflater.inflate(R.layout.alert_label_editor, null)
dialogBuilder.setView(dialogView)

val editText =  dialogView.findViewById(R.id.label_field)
editText.setText("test label")
val alertDialog = dialogBuilder.create()
alertDialog.show()

Antwort von @ user370305 neu gepostet .

Nilesh Deokar
quelle
2

Ändere das:

EditText editText = (EditText) findViewById(R.id.label_field);

dazu:

EditText editText = (EditText)  v.findViewById(R.id.label_field);
Der heilige Kodierer
quelle
1
View v=inflater.inflate(R.layout.alert_label_editor, null);
alertDialog.setContentView(v);
EditText editText = (EditText)v.findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();
Sercan Ozdemir
quelle
1
/**
 * Shows  confirmation dialog about signing in.
 */
private void startAuthDialog() {
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    AlertDialog alertDialog = dialogBuilder.create();
    alertDialog.show();

    alertDialog.getWindow().setLayout(800, 1400);
    LayoutInflater inflater = this.getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.auth_dialog, null);
    alertDialog.getWindow().setContentView(dialogView);
    EditText editText = (EditText) dialogView.findViewById(R.id.label_field);
    editText.setText("test label");
}
CodeToLife
quelle