En los documentos de Android en AlertDialog , proporciona la siguiente instrucción y ejemplo para configurar una vista personalizada en un AlertDialog:
Si desea mostrar una vista más compleja, busque el FrameLayout llamado "cuerpo" y agregue su vista:
FrameLayout fl = (FrameLayout) findViewById(R.id.body);
fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));
En primer lugar, es bastante obvio que add()es un error tipográfico y está destinado a serlo addView().
Estoy confundido por la primera línea que usa R.id.body. Parece que es el elemento del cuerpo del AlertDialog ... pero no puedo simplemente ingresar eso en mi código porque da un error de compilación. ¿Dónde se define o asigna R.id.body o lo que sea?
Aquí está mi código. Traté de usar setView(findViewById(R.layout.whatever)en el constructor pero no funcionó. ¿Estoy asumiendo porque no lo inflé manualmente?
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
fuente
                
                fuente

.setView(getLayoutInflater().inflate(R.layout.dialog_view, null))al constructor. Crédito a Sergio Viudes, a continuación.Respuestas:
Tienes razón, es porque no lo inflaste manualmente. Parece que estás intentando "extraer" la identificación del "cuerpo" del diseño de tu actividad, y eso no funcionará.
Probablemente quieras algo como esto:
fuente
builder.setView(inflater.inflate(R.id.dialog, ROOT_VIEWGROUP[, ATTACH_TO_ROOT])), los documentos dicen que el grupo de vistas raíz es opcional. ¿Debería utilizarse en este caso? Si es así ... todavía tengo que averiguar cómo obtener una referencia al AlertDialog ...Viewinflado. LlamarfindViewById()en queViewcuando se necesita cosas de su contenido. Ver: github.com/commonsguy/cw-android/tree/master/Database/ConstantsPuede crear su vista directamente desde Layout Inflater, solo necesita usar el nombre de su archivo XML de diseño y el ID del diseño en el archivo.
Su archivo XML debe tener una identificación como esta:
Y luego puede configurar su diseño en el constructor con el siguiente código:
fuente
getCurrentFocus()devolverá el EditText y un EditText no se puede convertir en un ViewGroup. El usonullcomo segundo argumento soluciona esto.android.R.id.custom devolvía nulo para mí. Me las arreglé para que esto funcione en caso de que alguien se encuentre con el mismo problema,
Como referencia, R.layout.simple_password es:
fuente
FrameLayoutActúa como una especie de fragmento? Cuando probé la respuesta de Andrewx2 anterior, recibí un error porque pensé que estaba inflando dos diseños (es mi suposición).Los documentos de Android se han editado para corregir los errores.
La vista dentro de AlertDialog se llama
android.R.id.customhttp://developer.android.com/reference/android/app/AlertDialog.html
fuente
Esto funcionó para mí:
fuente
Diálogo de alerta personalizado
Este ejemplo completo incluye la transferencia de datos a la actividad.
Crea un diseño personalizado
Se
EditTextusa un diseño con un para este ejemplo simple, pero puede reemplazarlo con lo que quiera.custom_layout.xml
Usar el diálogo en código
Las partes clave son
setViewpara asignar el diseño personalizado a laAlertDialog.BuilderEste es el código completo del proyecto de ejemplo que se muestra en la imagen de arriba:
MainActivity.java
Notas
DialogFragmentsubclase como se describe en la documentación .Ver también
fuente
EditText editText = customLayout.findViewById(R.id.editText);debería serEditText editText = (EditText) customLayout.findViewById(R.id.editText);Las líneas de código más simples que me funcionan son las siguientes:
Cualquiera que sea el tipo de diseño (LinearLayout, FrameLayout, RelativeLayout) funcionará
setViewy solo diferirá en la apariencia y el comportamiento.fuente
La forma más fácil de hacer esto es usando en
android.support.v7.app.AlertDialoglugar deandroid.app.AlertDialogwherepublic AlertDialog.Builder setView (int layoutResId)se puede usar debajo de API 21.fuente
AlertDialog.setView(View view)agrega la vista dada alR.id.custom FrameLayout. El siguiente es un fragmento de código fuente de Android desde elAlertController.setupView()que finalmente maneja esto (mViewes la vista dada alAlertDialog.setViewmétodo).fuente
Después de cambiar la ID en android.R.id.custom, necesitaba agregar lo siguiente para que se muestre la Vista:
Sin embargo, esto hizo que la nueva Vista se renderizara en una vista principal grande sin fondo, rompiendo el cuadro de diálogo en dos partes (texto y botones, con la nueva Vista en el medio). Finalmente obtuve el efecto que quería insertando mi Vista junto al mensaje:
Encontré esta solución explorando el árbol de vistas con View.getParent () y View.getChildAt (int). Sin embargo, no estoy muy contento con ninguno de los dos. Nada de esto está en los documentos de Android y si alguna vez cambian la estructura de AlertDialog, esto podría romperse.
fuente
Tendría más sentido hacerlo de esta manera, con la menor cantidad de código.
Para obtener una lista ampliada de las cosas que puede configurar, comience a escribir
.seten Android Studiofuente