2. Передача и получение данных из диалога

Так как диалоговое окно "обернуто" в объект фрагмента, то передача данных в диалоговое окно и получение данных из диалогового окна реализуется так же, как и в случае работы с фрагментами.

page2. Добавление фрагментов в Activity. Менеджер фрагментов

Рассмотрим небольшой пример в качестве наглядной иллюстрации процесса обмена данными с диалоговым окном. Используем уже созданный проект, данные вводятся в поле ввода, после чего они передаются в диалоговое окно. Результат работы диалогового окна передается обратно в Activity, которое вызвало диалоговое окно.

public class MyDialog extends DialogFragment {

    // Слушатель и интерфейс для передачи данных в Activity
    private MyDialogListener mListener;
    public static interface MyDialogListener {
        void onMyDialogResult(String choice);
    }
    
    // Статический метод для передачи данных в диалог
    public static MyDialog newInstance(String param1) {
        MyDialog fragment = new MyDialog();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        fragment.setArguments(args);
        return fragment;
    }

    private static final String ARG_PARAM1 = "param1";
    private String mParam1;

    // Получаем данные из Bundle
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mParam1 = getArguments() == null ? "null" : getArguments().getString(ARG_PARAM1);
    }
    
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setTitle(mParam1);
        builder.setItems(R.array.dialog_choices, (dialog, which) -> {
            // При выборе пункта возвращаем данные в Activity
            mListener.onMyDialogResult(getResources().getStringArray(R.array.dialog_choices)[which]);
            dismiss();
        });

        return builder.create();
    }

    // Получаем объект слушателя
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try {
            mListener = (MyDialogListener) context;
        } catch (ClassCastException ex) {
            throw new ClassCastException(context.toString() + " must implement MyDialog.MyDialogListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();

        mListener = null;
    }
}

Запустим приложение

Last updated