2012-03-19 3 views
14

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

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

Благодаря

ответ

14

Отличный способ, чтобы пройти этот вид событий является Callback интерфейс, как descripted в Android Developers Guide

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

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

Надежда, что помогает, далее Infos here

+21

Это не отвечает на вопрос ОП. Он хотел бы вернуться к фрагменту «MyFragment», и это позволит ему вернуться к активности, которая началась с «MyFragment». – eternalmatt

+3

Это способ взаимодействия между Activity и Fragment. Для связи между фрагментами используйте 'setTargetFragment()' и 'getTargetFragment()'. –

+2

Я бы хотел добавить к этому ответу: __DO НЕ ПРОШИВАТЬ НИЧЕГО ПОСЛЕ КОНСТРУКТОРА__ очень важно, чтобы конструктор можно было вызвать без аргументов (по умолчанию построено в терминах C++), используйте 'onAttach', так как этот ответ –

30

Как сказал eternalmatt данное решение не реально ответить на вопрос , Способ общения диалог с фрагментом зовёт:

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()' один) плюс некоторые проверки класса, чтобы обеспечить полное решение.

+0

Почему это public static mySuperFragmentDialog newInstance, а не public static void newInstance. Здесь я не вижу никакого заявления о возврате. –

+0

Возврат отсутствует, отредактирован. – juanmeanwhile

+0

@juanmeanwhile спасибо за информацию! но откуда нам нужно прослушивать экземпляр слушателя SuperListener? –

0

У меня была эта проблема один раз и после того, как я ее решил, я создал проект, который напомнил бы мне, как я это сделал. Я поставил проект на github, чтобы каждый мог видеть решение. Вот ссылка: https://github.com/mumasaba/FragmentFragmentBoss

В этом проекте у нас есть простое приложение с TextView, отображающее слова Hello World. Это текстовое представление находится на фрагменте, который размещается в основном приложении приложения. Этот фрагмент должен отображать новое слово, которое пользователь может ввести после нажатия на значок меню дополнительных опций. При нажатии кнопки меню параметров вызывается диалог, позволяющий пользователю вводить новое слово. После того, как пользователь будет выполнен, они могут щелкнуть ok, чтобы закрыть диалоговое окно и отобразить свой новый ввод в текстовом виде фрагмента. Таким образом, проиллюстрирована связь Fragment to DialogFragment.

Смежные вопросы