DialogFragment anidado múltiple de Android
Tengo un escenario donde muestro un DialogFragment
(usando getSupportFragmentManager()
) que muestra una lista de valores y un botón "Añadir". Si el usuario hace clic en el botón agregar, DialogFragment
otro DialogFragment
(usando getChildFragmentManager()
que consiste en un EditText
y un EditText
el usuario hace clic en el nuevo Button
si el valor pasa la validación, lo agrego a la EditText
no lo hace Validación de paso, muestro otro DialogFragment
que muestra un mensaje de error, y un botón "Aceptar" Me gustaría que cuando el botón "Aceptar" se presiona, el usuario todavía verá el DialogFragment
con el EditText
y el Button
para que pudieran Mire sobre el valor incorrecto y, posiblemente, cambiarlo Sin embargo, cuando se presiona el botón "Aceptar" en el mensaje de error DialogFragment
, se DialogFragment
el cuadro de diálogo y sólo se DialogFragment
el DialogFragment
original (aquel con la lista de valores).
¿Cómo mantendría el segundo DialogFragment
todavía exhibido después de que el tercero sea despedido?
- IntelliJ y android.support.v7.widget.GridLayout
- Cómo mostrar el indicador de pestaña en la parte superior de las pestañas
- Barra de herramientas de soporte de Android: Cambiar el tamaño no realineará los elementos del menú
- Arriba navegación roto en JellyBean?
- CollapsingToolbarLayout setTitle () ya no funciona
EDIT: Aquí hay algunos fragmentos de código:
//clicking this button shows the first ("outer") fragment findViewById(R.id.voicemail_notifications_email_addresses).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { AddressListDialog.newInstance( line, AddressListDialog.VOICEMAIL_NOTIFICATIONS_EMAIL) .show(((FragmentActivity)getContext()).getSupportFragmentManager(), "dialog"); } }); public static class AddressListDialog extends DialogFragment { public AddressListDialog() {} @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final View v = LayoutInflater.from(getActivity()).inflate(R.layout.vm_address_list_dialog, null); ListView lv = (ListView) v.findViewById(R.id.voicemail_notifications_address_list); final AddressAdapter adapter = new AddressAdapter(); lv.setAdapter(adapter); v.findViewById(R.id.voicemail_add_address_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //first child fragment AddAddressDialog.newInstance(getType()).setAdapter(adapter) .show(getChildFragmentManager(), "dialog"); } }); Dialog d = new AlertDialog.Builder(getActivity()) .setTitle(titleRes) .setView(v) .setPositiveButton(R.string.global_dialog_pos, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } } ) .create(); return d; } private class AddressAdapter extends BaseAdapter { . . . public boolean add(LineVoicemailInfo.VmContact contact) { if(addresses.size() >= 3) { return false; } else if(!contact.isValid(isEmailType())) { return true; } else { addresses.add(contact); notifyDataSetChanged(); return true; } } public static class AddAddressDialog extends DialogFragment { private AddressAdapter adapter; public AddAddressDialog() {} @Override public Dialog onCreateDialog(Bundle savedInstanceState) { DialogInterface.OnClickListener onPosClick = null; final View v; v = LayoutInflater.from(getActivity()).inflate(R.layout.voicemail_add_email_address, null); onPosClick = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { LineVoicemailInfo.VmContact contact = new LineVoicemailInfo.VmContact(((EditText)v.findViewById(R.id.voicemail_add_email_address)).getText().toString()); if(!adapter.add(contact)) { //second child fragment BadAddressDialog.newInstance("Not a valid address") .show(getChildFragmentManager(), "dialog"); } } }; Dialog d = new AlertDialog.Builder(getActivity()) .setTitle("Add Address") .setView(v) .setCancelable(false) .setPositiveButton(R.string.voicemail_addresses_add, onPosClick) .setNegativeButton(R.string.global_dialog_neg, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }) .create(); setCancelable(false); return d; } } public static class BadAddressDialog extends DialogFragment { public BadAddressDialog() {} public static BadAddressDialog newInstance(String message) { BadAddressDialog frag = new BadAddressDialog(); Bundle args = new Bundle(); args.putString("message", message); frag.setArguments(args); return frag; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { String message = getArguments().getString("message"); Dialog d = new AlertDialog.Builder(getActivity()) .setTitle("Error adding address") .setMessage(message) .setCancelable(false) .setPositiveButton(R.string.global_dialog_pos, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }) .create(); setCancelable(false); return d; } }
- ¿Cómo apoyar textView.setTextIsSelectable en versiones android inferiores?
- RecyclerView no respeta height = wrap_content?
- Cómo crear la biblioteca de soporte v4 desde el origen
- Android support library v 23.3.0 problema con el bocadillo
- Android TV: VerticalGridFragment sombra dimensión y color
- Android v21 Theme.Appcompat acento de color se ignora, sin relleno en los diálogos
- ¿Cómo puedo actualizar mi ListFragment cuando vuelve al diseño de la pila trasera?
- Fragmentos de Android. Retener un AsyncTask durante la rotación de la pantalla o el cambio de configuración
Supongo que el problema es que utiliza el método de presentación estándar para mostrar diálogos. De acuerdo con fuentes de Android, este método no agrega fragmento a backstack, por lo que el cuadro de diálogo más alto es descartado, el medio es descartado también.
Usted debe comenzar la trasacción por su cuenta antes de llamar a show
y agregar la transacción a backstack (llamada addToBackStack
). Un ejemplo se muestra en la página de documentación de DialogFragment .
- Android: compat: showAsAction = "always | withText" no funciona
- NoClassDefFound error al importar el proyecto desde git