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:
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.