Получить данные из диалога фрагментов - лучшие практики?
Я конвертирую часть моего проекта для использования фрагментов. Как мы общаемся с диалогом фрагментов? Я хочу создать диалог фрагмента, чтобы получить текстовый ввод от пользователя. Когда диалог отклонен, я хотел бы передать введенный текст обратно в "родительский" фрагмент (тот, который его запустил). Пример:
public class MyFragment extends Fragment {
public void onBtnClick() {
// What a good way to get data back from this dialog
// once it dismissed?
DialogFragment dlgFrag = MyFragmentDialog.newInstance();
dlgFrag.show(getFragmentManager(), "dialog");
}
}
Спасибо
Ответы
Ответ 1
Отличным способом передачи таких событий является интерфейс обратного вызова, как описано в Руководстве для разработчиков 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(...);
Надеюсь, что это поможет, дальнейшая информация здесь
Ответ 2
Как сказал вечный судья, данное решение на самом деле не отвечает на вопрос. Способ связи диалога с фрагментом вызывает:
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()'
и 'onAttach()'
один) плюс некоторые проверки класса для предоставления полное решение.
Ответ 3
У меня была эта проблема один раз, и после того, как я ее решил, я создал проект, который напомнил бы мне, как я это сделал. Я поставил проект на github, чтобы каждый мог видеть решение. Вот ссылка: https://github.com/mumasaba/FragmentFragmentBoss
В этом проекте у нас есть простое приложение с TextView, отображающее слова Hello World. Это текстовое представление находится на фрагменте, который размещается в основном приложении приложения. Этот фрагмент должен отображать новое слово, которое пользователь может ввести после нажатия на значок меню дополнительных опций. При нажатии кнопки меню параметров вызывается диалог, позволяющий пользователю вводить новое слово. После того, как пользователь будет выполнен, они могут щелкнуть ok, чтобы закрыть диалоговое окно и отобразить их новый ввод в виде фрагмента. Таким образом, проиллюстрирована связь фрагментации с диалоговым интерфейсом.