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.

¿Alguna sugerencia sobre cómo actualizar este fragmento una vez seleccionada en el fragmento de diálogo ?.

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;

  1. Implemente BroadcastReceiver en su actividad principal. Observe que se requiere implementar un método onReceive .

  2. onResume método onResume la actividad onResume 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")); } 
  3. onPause método onPause la actividad principal y onPause registro de la actividad como receptor para evitar "receptores filtrados" (se dará cuenta).

     @Override protected void onPause() { super.onPause(); unregisterReceiver(deleteSpotReceiver); } 
  4. 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 .

  • Cuando se utiliza ViewPager con Fragmentos, los fragmentos se destruyen al deslizar
  • Fragmento todavía existe después de quitar?
  • Fragmento reemplazado aún visible
  • Fragmento dentro de ViewPager devolver null en getView ()
  • Android: ¿Puedes anidar Fragmentos?
  • ¿Por qué podemos llamar a getActivity () en onCreateView que se ejecuta antes onActivityCreated?
  • Actualizar una vista de lista en un fragmento de un receptor de difusión
  • FindViewById devuelve NULL cuando se utiliza Fragment
  • Repoblando valores en Android Fragment onResume
  • La etiqueta de meta-datos no tiene valor correcto
  • FragmentTransaction no hacer nada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.