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 ...View
inflado. LlamarfindViewById()
en queView
cuando 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 usonull
como 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
FrameLayout
Actú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.custom
http://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
EditText
usa 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
setView
para asignar el diseño personalizado a laAlertDialog.Builder
Este es el código completo del proyecto de ejemplo que se muestra en la imagen de arriba:
MainActivity.java
Notas
DialogFragment
subclase 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á
setView
y 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.AlertDialog
lugar deandroid.app.AlertDialog
wherepublic 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 (mView
es la vista dada alAlertDialog.setView
mé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
.set
en Android Studiofuente