AlertDialog.Builder con diseño personalizado y EditText; no puede acceder a la vista

101

Estoy intentando crear un diálogo de alerta con un EditTextobjeto. Necesito establecer el texto inicial de la EditTextprogramación. Esto es lo que tengo.

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

¿Qué necesito cambiar para poder tener un EditTextobjeto válido ?

[editar]

Entonces, el usuario370305 y otros señalaron que debería usar alertDialog.findViewById(R.id.label_field);

Desafortunadamente, hay otro problema aquí. Aparentemente, configurar la vista de contenido en el AlertDialoghace que el programa se bloquee en tiempo de ejecución. Tienes que configurarlo en el constructor.

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

Desafortunadamente, cuando haces esto, alertDialog.findViewById(R.id.label_field);ahora regresa null.

[/editar]

Don Subert
fuente

Respuestas:

237

editTextes parte del alertDialogdiseño, así que solo acceda editTextcon la referencia dealertDialog

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

Actualizar:

Porque en la línea de código dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));

inflateres nulo .

actualice su código como se muestra a continuación e intente comprender cada línea de código

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

Actualización 2:

Como está utilizando el objeto View creado por Inflater para actualizar los componentes de la interfaz de usuario, puede usar directamente el setView(int layourResId)método de AlertDialog.Builderclase, que está disponible desde API 21 en adelante.

user370305
fuente
22
U también puede hacerlo como:dialogBuilder.setView(R.layout.dialog_layout);
SiavA
4
@SiavA este método solo está disponible desde API 21.
Scaraux
He estado intentando mostrar Dialog y no funcionaba en RecyclerView, pero este sí lo hizo.
Muneeb Mirza
Puede usar getLayoutInflater()cuando inflaterno está definido.
barra invertidaN
1
@saigopi cuando anula onClick, habrá argumentos (diálogo DialogInterface, int id). En este método onClick, simplemente pase dialog.cancel ();
Minkoo
28

Usa este

   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
fuente
debería ser builder.create().show();, puede consultar el builder.show();código para obtener más detalles
Phan Van Linh
9

Puedes escribir:

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
fuente
3

En caso de que alguien lo quiera en Kotlin:

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

Se volvió a publicar la respuesta de @ user370305 .

Nilesh Deokar
fuente
2

Cambia esto:

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

a esto:

EditText editText = (EditText)  v.findViewById(R.id.label_field);
El santo codificador
fuente
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
fuente
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
fuente