Fragmento de actualización en la selección de opciones de fragmentos de diálogo
Tengo un fragmento que en un clic de componente pop-ups DialogFragment. Este fragmento de diálogo contiene una lista de opciones. Cuando se selecciona una opción de lista, quiero notificar fragmento para que pueda ejecutar el procedimiento de actualización de campos. Hice algo como esto
@Override public void onClick(DialogInterface dialog, int item) { updateSharedPreference(item); Log.e("ProfilePersonaListDialog", "Click on dialog, inside onClick"); OnCloseListDialogListener act = (OnCloseListDialogListener) getActivity(); act.onDialogListSelection(); dismiss(); }
Sin embargo, este getActivity () llama a FragmentActivity y no el fragmento que desencadenó el fragmento de diálogo. Podría matar actualmente abrir / ejecutar fragmento y llamar a una nueva instancia que obtendría los campos actualizados, pero que es la solución sucia que me gustaría evitar.
- El color de fondo de Viewpager se filtra a través de la primera página
- Android throw InflateException binario línea de archivo xml: Error al inflar fragmento de clase
- Error "java.lang.IllegalStateException: No se puede cambiar la etiqueta de fragmento" cuando se utiliza ViewPager # setCurrentItem ()
- getChildFragmentManager () no se puede resolver o no se puede hacer referencia
- Android Fragments getView devolver el padre de la vista?
¿Alguna sugerencia sobre cómo actualizar este fragmento una vez seleccionada en el fragmento de diálogo ?.
- Agregar fragmento a framelayout de forma programática en android
- Android 4.4 - Estado translúcido / barras de navegación - fitsSystemWindows / clipToPadding no funcionan con transacciones de fragmentos
- GetActivity () es nulo dentro de AlertDialog de un fragmento
- Fragmento de actualización de ViewPager en el dispositivo
- NullPointerException en onRestoreInstanceState
- fragmento de llamada dentro de la clase AppWidgetProvider
- Pase entre actividades
- Android - instanciar un fragmento varias veces?
Acabo de regresar con la solución. Mi problema era en realidad el reenvío actual fragmento getTag () cadena como parámetro de show () para DialogFragment. Si alguien interesado aquí es muestra de trabajo.
Crear un oyente simple
public interface OnCloseListDialogListener { public void onDialogListSelection(); }
Crear un nuevo cuadro de diálogo que extenderá DialogFragment
public class ListDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { private PersonaData[] mPersonaData; private String[] mPersonaName; private final String TAG; public static ListDialogFragment newInstance(PersonaData[] personaData, String tag) { ListDialogFragment dialog = new ListDialogFragment(personaData, tag); Bundle bundle = new Bundle(); dialog.setArguments(bundle); return dialog; } private ListDialogFragment(PersonaData[] personaData, String tag) { this.mPersonaData = personaData.clone(); this.TAG = tag; } @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); setCancelable(true); int style = DialogFragment.STYLE_NORMAL, theme = 0; setStyle(style, theme); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.dialog_title); mPersonaName = getData();//Your own implementation here builder.setNegativeButton("Cancel", this); builder.setSingleChoiceItems(mPersonaName, -1, new SingleChoiceListener()); return builder.create(); } @Override public void onClick(DialogInterface dialogInterface, int i) { } private class SingleChoiceListener implements DialogInterface.OnClickListener { @Override public void onClick(DialogInterface dialog, int item) { updateSharedPreference(item); OnCloseListDialogListener act = (OnCloseListDialogListener) getFragmentManager().findFragmentByTag(TAG); act.onDialogListSelection(); dismiss(); } } }
Y luego en el fragmento desde el que desea llamar a este diálogo haga lo siguiente. DIALOG es sólo String constante que he puesto allí sólo diálogo
SOME_CLICKABLE.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); ListDialogFragment dialog = ListDialogFragment.newInstance(mPersona, getTag()); dialog.show(manager, DIALOG); } });
Es necesario en la mayoría de los casos que un Fragment
sea consciente de que se está ejecutando bajo el contexto de una Activity
de cierta descripción y aceptable para el Fragmento hijo para invocar un método en una interfaz implícitamente implementada por la Actividad principal (como lo demuestra el cast en Su fragmento de código). Cuando obtienes tus referencias funcionando como señala Tomasz, serás de oro.
Sin embargo, 🙂 para ayudar a la reutilización del fragmento de diálogo, sugeriría que aproveche BroadcastReceiver
. Un BroadcastReceiver simplemente transmite un mensaje diciendo que hice 'x' . La actividad de los padres o en cualquier otro componente de nivel superior puede declarar que estoy escuchando 'x' . Una vez que el evento se haya disparado en el componente de diálogo, este evento será recopilado por la Actividad de la onReceive
principal onReceive
donde se puede ejecutar el código necesario para actualizar los campos.
A nivel personal, prefiero este acoplamiento suelto sobre el enfoque de la interfaz de fundición ya que me obliga a pensar en el propósito de cada fragmento y mantenerlo modular.
Si desea darle una oportunidad, entonces tenga una lectura sobre la sección de guía de dev en BroadcastReceivers y siga los siguientes pasos;
-
Implemente
BroadcastReceiver
en su actividad principal. Observe que se requiere implementar un métodoonReceive
. -
onResume
métodoonResume
la actividadonResume
y registre la actividad como receptor de un evento con la acción intencional "blah". Algo como;@Override protected void onResume() { super.onResume(); registerReceiver(this, new IntentFilter("blah")); }
-
onPause
métodoonPause
la actividad principal yonPause
registro de la actividad como receptor para evitar "receptores filtrados" (se dará cuenta).@Override protected void onPause() { super.onPause(); unregisterReceiver(deleteSpotReceiver); }
-
En su
DialogFragment
onClick
el evento que su actividad principal está 'escuchando'.@Override public void onClick(DialogInterface dialog, int item) { updateSharedPreference(item); Log.e("ProfilePersonaListDialog", "Click on dialog, inside onClick"); final Intent intent = new Intent(); intent.setAction("blah"); getActivity().sendBroadcast(intent); dismiss(); }
La actividad principal recopilará el mensaje y podrá continuar procesándolo. Déjeme saber si usted decide adoptar ese método.
Sólo la forma en que lo hizo por encima y añadir algo así en su actividad:
public void onDialogListSelection() { AnotherFragment anotherFragment = (AnotherFragment) getSupportFragmentManager() .findFragmentById(R.id.anotherFragment); anotherFragment.customMethodToNotifyListHasBeenSelected(); }
Por supuesto, si no usas la Biblioteca de Soporte, entonces llama a getFragmentManager
lugar de getSupportFragmentManager
.