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

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

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

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

Ответ 1

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

Вы можете использовать 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();
    }
}

Ответ 2

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

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