¿Cómo puedo mostrar una vista de lista en un cuadro de diálogo de alerta de Android?
En una aplicación de Android, quiero mostrar una vista de lista personalizada en un AlertDialog.
¿Cómo puedo hacer esto?
Se utiliza el siguiente código para mostrar una lista personalizada en AlertDialog
AlertDialog.Builder builderSingle = new AlertDialog.Builder(DialogActivity.this);
builderSingle.setIcon(R.drawable.ic_launcher);
builderSingle.setTitle("Select One Name:-");
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(DialogActivity.this, android.R.layout.select_dialog_singlechoice);
arrayAdapter.add("Hardik");
arrayAdapter.add("Archit");
arrayAdapter.add("Jignesh");
arrayAdapter.add("Umang");
arrayAdapter.add("Gatti");
builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builderSingle.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String strName = arrayAdapter.getItem(which);
AlertDialog.Builder builderInner = new AlertDialog.Builder(DialogActivity.this);
builderInner.setMessage(strName);
builderInner.setTitle("Your Selected Item is");
builderInner.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
dialog.dismiss();
}
});
builderInner.show();
}
});
builderSingle.show();
Según la documentación , existen tres tipos de listas que se pueden utilizar con AlertDialog
:
- Lista tradicional de opción única
- Lista persistente de opción única (botones de opción)
- Lista persistente de opciones múltiples (casillas de verificación)
Daré un ejemplo de cada uno a continuación.
Lista tradicional de opción única
La forma de hacer una lista tradicional de opción única es usar setItems
.
versión java
// setup the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose an animal");
// add a list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
builder.setItems(animals, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0: // horse
case 1: // cow
case 2: // camel
case 3: // sheep
case 4: // goat
}
}
});
// create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();
No es necesario un botón Aceptar porque tan pronto como el usuario hace clic en un elemento de la lista, el control regresa al archivo OnClickListener
.
Versión Kotlin
// setup the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose an animal")
// add a list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
builder.setItems(animals) { dialog, which ->
when (which) {
0 -> { /* horse */ }
1 -> { /* cow */ }
2 -> { /* camel */ }
3 -> { /* sheep */ }
4 -> { /* goat */ }
}
}
// create and show the alert dialog
val dialog = builder.create()
dialog.show()
Lista de botones de opción
La ventaja de la lista de botones de opción sobre la lista tradicional es que el usuario puede ver cuál es la configuración actual. La forma de hacer una lista de botones de opción es usar setSingleChoiceItems
.
versión java
// setup the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose an animal");
// add a radio button list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
int checkedItem = 1; // cow
builder.setSingleChoiceItems(animals, checkedItem, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// user checked an item
}
});
// add OK and Cancel buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// user clicked OK
}
});
builder.setNegativeButton("Cancel", null);
// create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();
Codifiqué el elemento elegido aquí, pero puedes realizar un seguimiento con una variable miembro de clase en un proyecto real.
Versión Kotlin
// setup the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose an animal")
// add a radio button list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
val checkedItem = 1 // cow
builder.setSingleChoiceItems(animals, checkedItem) { dialog, which ->
// user checked an item
}
// add OK and Cancel buttons
builder.setPositiveButton("OK") { dialog, which ->
// user clicked OK
}
builder.setNegativeButton("Cancel", null)
// create and show the alert dialog
val dialog = builder.create()
dialog.show()
Lista de casillas de verificación
La forma de hacer una lista de casillas de verificación es usar setMultiChoiceItems
.
versión java
// setup the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose some animals");
// add a checkbox list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
boolean[] checkedItems = {true, false, false, true, false};
builder.setMultiChoiceItems(animals, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// user checked or unchecked a box
}
});
// add OK and Cancel buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// user clicked OK
}
});
builder.setNegativeButton("Cancel", null);
// create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();
Aquí codifiqué los elementos de la lista que ya estaban marcados. Es más probable que desee realizar un seguimiento de ellos en un archivo ArrayList<Integer>
. Consulte el ejemplo de documentación para obtener más detalles. También puede configurar los elementos marcados null
si siempre desea que todo comience sin marcar.
Versión Kotlin
// setup the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose some animals")
// add a checkbox list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
val checkedItems = booleanArrayOf(true, false, false, true, false)
builder.setMultiChoiceItems(animals, checkedItems) { dialog, which, isChecked ->
// user checked or unchecked a box
}
// add OK and Cancel buttons
builder.setPositiveButton("OK") { dialog, which ->
// user clicked OK
}
builder.setNegativeButton("Cancel", null)
// create and show the alert dialog
val dialog = builder.create()
dialog.show()
Notas
- Para el
context
código anterior, no lo usegetApplicationContext()
o obtendrá unIllegalStateException
(consulte aquí el motivo). En su lugar, obtenga una referencia al contexto de la actividad, como por ejemplo conthis
. - También puede completar los elementos de la lista desde una base de datos u otra fuente usando
setAdapter
osetCursor
pasando aCursor
oListAdapter
asetSingleChoiceItems
osetMultiChoiceItems
. - Si la lista es más larga de lo que cabe en la pantalla, el cuadro de diálogo la desplazará automáticamente. Sin embargo, si tiene una lista muy larga, supongo que probablemente debería crear un cuadro de diálogo personalizado con RecyclerView .
Para probar todos los ejemplos anteriores, solo tenía un proyecto simple con un solo botón que mostraba el cuadro de diálogo al hacer clic:
import android.support.v7.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; } public void showAlertDialogButtonClicked(View view) { // example code to create alert dialog lists goes here } }
Relacionado
- Diálogo de alerta de Android con uno, dos y tres botones
- Cómo implementar una vista AlertDialog personalizada