2012-03-19 13 views
14

Konwertuję część mojego projektu, aby używać fragmentów. W jaki sposób komunikujemy się z oknem dialogowym fragmentu? Chcę utworzyć okno dialogowe fragmentu tylko po to, aby uzyskać trochę tekstu od użytkownika. Kiedy okno dialogowe zostanie odrzucone, chciałbym przekazać wprowadzony tekst z powrotem do fragmentu "rodzica" (ten, który go uruchomił). Przykład:Odzyskaj dane z okna dialogowego fragmentu - najlepsze praktyki?

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

Dzięki

Odpowiedz

14

To świetny sposób, aby zdać ten rodzaj wydarzenia jest Interfejs telefoniczny jak descripted w Android Developers Guide

swojej Fragment zdefiniowanie interfejsu zwrotnego jak

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

Następnie sprawdza się wewnątrz metody onAttach, jeśli rodzic zaimplementował interfejs wywołania zwrotnego i zapisze wystąpienie.

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

gdy zdarzenia wewnątrz Fragment dzieje się po prostu zadzwonić do oddzwaniania Handler

mListener.onArticleSelected(...); 

nadzieję, że pomoże dalsze infos here

+21

To nie odpowiada na pytanie OP. Chciałby przekazać z powrotem fragment "MyFragment", a to pozwoliłoby mu komunikować się z działaniem, które uruchomiło 'MyFragment'. – eternalmatt

+3

To jest sposób komunikacji między działaniem a fragmentem. Aby komunikować się między Fragmentami, użyj 'setTargetFragment()' i 'getTargetFragment()'. –

+2

Chciałbym dodać do tej odpowiedzi: __ NIE PRZEKRACZAJĄC ANI ZA ŻADNEGO KONSTRUKTORA____ ważne jest, aby konstruktor mógł zostać wywołany bez argumentów (domyślnie skonstruowane w kategoriach C++), użyj 'onAtukuj', ponieważ ta odpowiedź ma wartość –

30

Jak powiedział eternalmatt dany rozwiązanie tak naprawdę nie odpowiedzieć na pytanie . Sposób komunikowania się okno z fragmentem woła:

dialog.setTargetFragment(myCallingFragment, requestCode); 

droga zrobić to poprzez stworzenie FragmentDialog ze statycznej metody gdzie słuchacz instanciated następnie wykonaj setFragmentTarget() rzeczy:

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

aby utworzyć okno z fragmentem prostu zrobić jak zwykle:

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

Wtedy, gdy chcemy porozumieć się z fragmentem, który wywołuje okno tylko:

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

To rozwiązanie działa tylko wtedy, gdy okno dialogowe jest zamiar być tworzone z Fragmenty a nie z działalności, ale można połączyć obie metody ('setFragmentTarget()' i jednej 'onAttach()') plus jakieś kontrole klasy, aby zapewnić pełne rozwiązanie.

+0

Dlaczego jest publiczny static mySuperFragmentDialog newInstance, a nie public static void newInstance. Nie widzę tutaj żadnego zwrotu. –

+0

Brakuje zwrotu, edytowano. – juanmeanwhile

+0

@juanmeanwhile dzięki za informacje! ale z miejsca, w którym potrzebujemy słuchacza, tworzy się słuchacz SuperListener? –

0

Miałem ten problem raz i po rozwiązaniu go, stworzyłem projekt, który przypomni mi, jak to zrobiłem. Położyłem projekt na github, aby każdy mógł zobaczyć rozwiązanie. Oto link: https://github.com/mumasaba/FragmentFragmentBoss

W tym projekcie mamy prostą aplikację z tekstem wyświetlającym słowa "Hello World". Ten widok tekstowy znajduje się na fragmencie hostowanym przez główną aktywność w aplikacji. Fragment ten musi wyświetlić nowe słowo, które użytkownik może wprowadzić po kliknięciu ikony menu opcji dodawania. Po kliknięciu, element menu opcji wywołuje okno dialogowe pozwalające użytkownikowi na wpisanie nowego słowa. Po zakończeniu przez użytkownika można kliknąć przycisk OK, aby zamknąć okno dialogowe i wyświetlić nowe dane wejściowe w widoku tekstowym fragmentu. Dlatego zilustrowano komunikację Fragment do DialogFragment.