2012-03-19 13 views
14

Sto convertendo alcuni dei miei progetti per utilizzare i frammenti. Come comunichiamo con una finestra di dialogo dei frammenti? Voglio creare una finestra di dialogo dei frammenti solo per ottenere del testo da parte dell'utente. Quando la finestra di dialogo viene chiusa, vorrei passare il testo inserito al frammento "padre" (quello che l'ha avviato). Esempio:Recupera i dati da una finestra di dialogo dei frammenti: le migliori pratiche?

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

Grazie

risposta

14

Un ottimo modo per passare questo tipo di eventi è un interfaccia di callback come descripted in Android Developers Guide

tuo Frammento definire un'interfaccia di callback come

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

Quindi si controlla all'interno del metodo onAttach se il genitore ha implementato l'interfaccia di richiamata e si è salvata l'istanza.

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

quando il vostro evento all'interno del frammento accade è sufficiente chiamare la richiamata Handler

mListener.onArticleSelected(...); 

Speranza che aiuta, ulteriori informazioni here

+21

Questo non risponde alla domanda dell'OP. Vorrebbe comunicare di nuovo al frammento 'MyFragment' e questo gli permetterebbe di tornare all'attività che ha avviato' MyFragment'. – eternalmatt

+3

Ecco come comunicare tra un'attività e un frammento. Per comunicare tra Frammenti, usa 'setTargetFragment()' e 'getTargetFragment()'. –

+2

Vorrei aggiungere a questa risposta: __DON NON PASSARE NULLA TRAMITE IL COSTRUTTORE__ è essenziale che il costruttore possa essere chiamato senza argomenti (predefinito costruito in termini C++), utilizzare 'onAttach', come questa risposta è –

30

Come ha detto eternalmatt la soluzione data in realtà non rispondere alla domanda . Il modo di comunicare la finestra di dialogo con il frammento sta chiamando:

dialog.setTargetFragment(myCallingFragment, requestCode); 

Il mio modo di fare questo è creando il FragmentDialog con un metodo statico in cui l'ascoltatore è istanziare un poi fare la roba 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; 
    } 
} 

per creare la finestra dal frammento basta fare come al solito:

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

Poi, quando si vuole comunicare con il frammento che richiama la finestra di dialogo appena:

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

Questa soluzione funziona solo quando dialogo sta andando essere creato da Frammenti e non dalle attività, ma è possibile combinare entrambi i metodi ('setFragmentTarget()' e la 'onAttach()' uno) oltre ad alcuni controlli di classe per fornire una soluzione completa.

+0

Perché è statico pubblico mySuperFragmentDialog newInstance e non public static void newInstance. Non vedo alcuna dichiarazione di ritorno qui. –

+0

Il ritorno mancava, editato. – juanmeanwhile

+0

@juanmeanwhile grazie per le informazioni! ma da dove abbiamo bisogno di ascoltatore istanziare l'ascoltatore SuperListener? –

0

Ho avuto questo problema una volta e dopo ho risolto, ho creato un progetto che mi ricordano come ho fatto. Metto il progetto su Github in modo che chiunque possa vedere la soluzione. Ecco il link: https://github.com/mumasaba/FragmentFragmentBoss

In questo progetto, abbiamo una semplice app con una TextView che mostra le parole "Hello World". Questa visualizzazione di testo si trova su un frammento che è ospitato dall'attività principale dell'app. Questo frammento deve visualizzare una nuova parola che l'utente può inserire dopo aver fatto clic sull'icona del menu Opzioni Aggiungi. Quando si fa clic, la voce di menu Opzioni richiama una finestra di dialogo che consente all'utente di digitare la nuova parola. Dopo che l'utente ha finito, possono fare clic su OK per chiudere la finestra di dialogo e visualizzare il nuovo input sulla vista di testo del frammento. Pertanto, viene illustrata la comunicazione da Fragment to DialogFragment.

Problemi correlati