Cómo obtener clics de botón en el fragmento de host desde el fragmento de diálogo

Tengo un listFragment, donde quiero mostrar un DialogFragment (Sí / No) en listItemClick. Deseo recuperar la selección del usuario (Sí / No) en listFragment. He leído sobre el mecanismo de la interfaz del oyente, pero eso funciona con el fragmento activity . Una forma de hacer esto puede ser:

  1. Defina la interfaz en el fragmento de diálogo que contiene las funciones de selección de botón sí / no, y llame a estos métodos en los clics de botón positivo / negativo del diálogo de alerta.
  2. Implementa esta interfaz en Actividad principal.
  3. Inicie dialogFragment en listFragment onItem click.
  4. Guardar la selección del usuario en la actividad.
  5. obtén esta opción en listFragment por otra interfaz, implementada en Main activity.

Pero, ¿tenemos algún mecanismo simple para esta simple tarea? cualquier ejemplo o código?

Hay otra forma de recuperar el resultado de DialogFragment.

Puedes usar Fragment.setTargetFragment () . Al crear una instancia de su DialogFragment, establezca el fragmento de destino en él. Luego, en DialogFragment, puede obtener este fragmento de Fragment.getTargetFragment () .

Por ejemplo, puedes hacerlo así:

public interface DialogClickListener { public void onYesClick(); public void onNoClick(); } 
 public class MyListFragment extends ListFragment implements DialogClickListener { ... private void showDialog() { DialogFragment dialog = new MyDialogFragment(); dialog.setTargetFragment(this, 0); dialog.show(getFragmentManager(), "dialog"); } @Override public void onYesClick() { // do something } @Override public void onNoClick() { // do something } } 
 public class MyDialogFragment extends DialogFragment { private DialogClickListener callback; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { callback = (DialogClickListener) getTargetFragment(); } catch (ClassCastException e) { throw new ClassCastException("Calling fragment must implement DialogClickListener interface"); } } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("message") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { callback.onYesClick(); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { callback.onNoClick(); } }); return builder.create(); } } 

También puede usar un bus de eventos para facilitar la comunicación entre los componentes. Otto es una gran biblioteca para usar disponible aquí -> https://github.com/square/otto . Está hecho por los chicos de Square para que sepas que es un proyecto de código abierto de calidad.

Tienen una muestra en el repository que muestra lo fácil que es usarla.