Получить данные из диалога фрагментов – лучшие практики?

Я конвертирую часть своего проекта для использования фрагментов. Как мы общаемся с диалогом фрагментов? Я хочу создать диалог фрагмента, чтобы получить текстовый ввод от пользователя. Когда диалог отклонен, я хотел бы передать введенный текст обратно в «родительский» фрагмент (тот, который его запустил). Пример:

public class MyFragment extends Fragment { public void onBtnClick() { // What's a good way to get data back from this dialog // once it's dismissed? DialogFragment dlgFrag = MyFragmentDialog.newInstance(); dlgFrag.show(getFragmentManager(), "dialog"); } } 

благодаря

Solutions Collecting From Web of "Получить данные из диалога фрагментов – лучшие практики?"

Отличным способом передачи такого рода событий является интерфейс обратного вызова, как описано в Руководстве для разработчиков Android

Ваш фрагмент определяет интерфейс обратного вызова, например

 public class MyFragment extends Fragment { ... // Container Activity must implement this interface public interface OnArticleSelectedListener { public void onArticleSelected(Uri articleUri); } ... } 

Затем вы проверяете внутри своего метода onAttach, если родитель выполнил интерфейс обратного вызова и сохранил экземпляр.

 @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnArticleSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); } } 

Когда ваше Событие внутри Фрагмента происходит, вы просто вызываете обработчик обратного вызова

 mListener.onArticleSelected(...); 

Надеюсь, что это поможет, дополнительная информация здесь

Как велнматт сказал, что данное решение на самом деле не отвечает на вопрос. Способ связи диалога с фрагментом вызывает:

 dialog.setTargetFragment(myCallingFragment, requestCode); 

Способ, которым я это делаю, – создать FragmentDialog со статическим методом, в котором слушатель будет инсталлирован, а затем сделать материал setFragmentTarget() :

 public mySuperFragmentDialog extends DialogFragment { public interface SuperListener{ void onSomethingHappened(); } public static mySuperFragmentDialog newInstance(SuperListener listener){ MySuperFagmentDialog f = new MySuperFragmentDialog(); f.setTargetFragment((Fragment) listener, /*requestCode*/ 1234); return f; } } 

Чтобы создать диалог из фрагмента, выполните как обычно:

 Dialog dialog = MySuperFragmentDialog.newInstance(parentFragment); dialog.show(); 

Затем, когда вы хотите общаться с фрагментом, который вызывает диалог:

 Fragment parentFragment = getTargetFragment(); ((SuperListener) parentFragment).onSomethingHappened(); 

Это решение работает только тогда, когда диалог будет создан из фрагментов, а не из 'setFragmentTarget()' , но вы можете комбинировать оба метода ( 'setFragmentTarget()' и 'onAttach()' one) плюс некоторые проверки класса для обеспечения полного решения.