Как получить нажатие кнопки в фрагменте хоста из фрагмента диалога

У меня есть listFragment, где я хочу отобразить DialogFragment (Да / Нет) в listItemClick. Я хочу вернуть пользовательский выбор (Да / Нет) в listFragment. Я прочитал о механизме интерфейса слушателя, но работает с фрагментом активности <->. Один из способов сделать это можно:

  1. Определите интерфейс в фрагменте диалога, содержащий функции выбора кнопок да / нет, и вызовите эти методы в диалоговом окне предупреждения о положительном / отрицательном нажатии кнопки.
  2. Внедрите этот интерфейс в основную деятельность.
  3. Инициировать диалогFragment в спискеFragment onItem.
  4. Сохраните выбор пользователя в действии.
  5. Получите этот выбор в спискеFragment другим интерфейсом, реализованным в Основной деятельности.

Но есть ли у нас простой механизм для этой простой задачи? Любой пример или код?

Solutions Collecting From Web of "Как получить нажатие кнопки в фрагменте хоста из фрагмента диалога"

Есть еще один способ вернуть результат из диалогового окна.

Вы можете использовать Fragment.setTargetFragment () . При создании экземпляра вашего DialogFragment установите для него целевой фрагмент. Затем в DialogFragment вы можете получить этот фрагмент из Fragment.getTargetFragment () .

Например, вы можете сделать это так:

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(); } } 

Вы также можете использовать шину событий для облегчения связи между компонентами. Отто – отличная библиотека, которую можно использовать здесь -> https://github.com/square/otto . Это сделано партией Square, чтобы вы знали свой качественный проект с открытым исходным кодом.

У них есть образец в репозитории, который показывает вам, как легко его использовать.