2014-05-21 12 views
31

Sto usando un DialogFragment, che sto mostrando come questo da un Activity:DialogFragment e onDismiss

DialogFragmentImage dialog = DialogFragmentImage.newInstance(createBitmap()); 
dialog.onDismiss(dialog);.onDismiss(this);   
dialog.show(getFragmentManager(), "DialogFragmentImage"); 

Vorrei controllare quando il DialogFragment è stato respinto (per esempio quando è stato premuto il tasto back), ma nel mio Activity. Come lo posso fare? Come posso "dire" al mio activity che il t DialogFragmen è stato rimosso?

+0

è possibile utilizzare valore booleano prima dimissing la finestra e utilizzare tale valore booleano per notificare l'attività –

+0

Va bene, come faccio a comunicare l'attività? – deimos1988

+0

impostare inizialmente il valore booleano su falso e prima di chiudere la finestra di dialogo imposta il valore booleano su true e notificare l'attivazione utilizzare il valore booleano per verificare se il valore è vero o falso –

risposta

62

Fai la tua attività implementare OnDismissListener

public final class YourActivity extends Activity implements DialogInterface.OnDismissListener { 

    @Override 
    public void onDismiss(final DialogInterface dialog) { 
     //Fragment dialog had been dismissed 
    } 

} 

DialogFragment già implementa OnDismissListener, basta eseguire l'override del metodo e chiamare l'Activity.

public final class DialogFragmentImage extends DialogFragment { 

    ///blah blah 

    @Override 
    public void onDismiss(final DialogInterface dialog) { 
     super.onDismiss(dialog); 
     final Activity activity = getActivity(); 
     if (activity instanceof DialogInterface.OnDismissListener) { 
      ((DialogInterface.OnDismissListener) activity).onDismiss(dialog); 
     } 
    } 

} 

Se si sta iniziando la finestra di dialogo da un frammento utilizzando il gestore childFragment (API> = 17), è possibile utilizzare getParentFragment per parlare con l'onDismissListener sul frammento genitore .:

public final class DialogFragmentImage extends DialogFragment { 

    ///blah blah 

    @Override 
    public void onDismiss(final DialogInterface dialog) { 
     super.onDismiss(dialog); 
     Fragment parentFragment = getParentFragment(); 
     if (parentFragment instanceof DialogInterface.OnDismissListener) { 
      ((DialogInterface.OnDismissListener) parentFragment).onDismiss(dialog); 
     } 
    } 

} 
+0

@ashishduh l'op sta usando un DialogFragment, non una finestra di dialogo – Blackbelt

+8

Non è possibile impostare il listener di rimozione su una finestra di dialogo di proprietà di un 'DialogFragment', La soluzione fornita da Doctoror Drive è quella giusta. Non dimenticarti di chiamare 'super.onDismiss (dialog)' - altrimenti le cose si romperanno. – nitzanj

+0

@nitzanj grazie. Aggiunto super chiamata alla mia risposta. –

2

Risposta alternativa, se non si ha accesso al metodo onDismiss di attività.

//DIALOGFRAGMENT 
//Create interface in your DialogFragment (or a new file) 
public interface OnDismissListener { 
    void onDismiss(MyDialogFragment myDialogFragment); 
} 
//create Pointer and setter to it 
private OnDismissListener onDismissListener; 
public void setDissmissListener(DissmissListener dissmissListener) { 
    this.dissmissListener = dissmissListener; 
} 
//Call it on the dialogFragment onDissmiss 
@Override 
public void onDismiss(DialogInterface dialog) { 
    super.onDismiss(dialog); 

    if (onDismissListener != null) { 
     onDismissListener.onDismiss(this); 
    } 
} 

//OTHER CLASS, start fragment where you want 
MyDialogFragment df = new MyDialogFragment(); 
df.setOnDismissListener(new MyDialogFragment.OnDismissListener() { 
    @Override 
    public void onDismiss(MyDialogFragment myDialogFragment) { 
     //Call when MyDialogFragment close 
    } 
}); 
df.show(activity.getFragmentManager(), "myDialogFragment"); 

edit: se il sistema ha bisogno di ricreare DialogFragment: lo si può trovare con

MyDialogFragment myDialogFragment = getFragmentManager().findFragmentByTag("MyDialogFragment"); 
if(myDialogFragment != null) { 
    myDialogFragment.setOnDismissListener(...); 
} 
+0

Stavo facendo questo e ho pensato che fossi intelligente, ma questo è pericoloso. Se il framework decide di ricreare la finestra di dialogo (a causa di una modifica della configurazione o di una rotazione dello schermo), utilizzerà il costruttore di frammenti di dialogo vuoto e onDismissListener non verrà impostato. – Aphex

+0

Sì hai ragione. Aggiungi questo in onCreate della tua attività MyDialogFragment myDialogFragment = getFragmentManager(). FindFragmentByTag ("MyDialogFragment"); if (myDialogFragment! = Null) { myDialogFragment.setOnDismissListener (...); } – Anthone

+0

E naturalmente aggiungere lo stesso tag nel dialogFragment.show (getFragmentManager(), "MyDialogFragment") – Anthone

6

Ecco la mia risposta. È un po 'tardi ma forse è di beneficio a qualcuno che passa.

FragmentManager fm = getFragmentManager(); 

YourDialogFragment dialog = new YourDialogFragment(); 
dialog.show(fm,"MyDialog"); 

fm.executePendingTransactions(); 
dialog.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() { 
        @Override 
        public void onDismiss(DialogInterface dialogInterface) { 
         //do whatever you want when dialog is dismissed 
        } 
       }); 

abbiamo bisogno di chiamare

fm.executePendingTransactions(); 

Per assicurarsi che il lavoro FragmentTransaction è stata eseguita. Altrimenti NullPointerException può verificarsi quando si chiama setOnDismissListener().

Siamo spiacenti se c'è qualche errore. Spero che questo aiuto.

+0

Non funziona con un gestore framment di supporto. – Simas

+0

@Simas: puoi approfondire "non funziona"? C'è un errore di compilazione? un problema di runtime? – LarsH

+0

@LarsH per quanto ricordo di aver chiamato 'fm.executePendingTransactions();' non ha protetto da un NPE come si dice in questa risposta. – Simas

2

Questo è un vecchio problema ma non ho trovato nessuna soluzione di cui sia soddisfatto. Non mi piace passare gli Listener al mio DialogFragment o impostare un TargetFragment, perché questo potrebbe infrangere il cambiamento di orientamento. Cosa ne pensi di questo?

 MyDialog d = new MyDialog(); 
     d.show(fragmentManager, "tag"); 
     fragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() { 
      @Override 
      public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) { 
       super.onFragmentViewDestroyed(fm, f); 
       //do sth  
     fragmentManager.unregisterFragmentLifecycleCallbacks(this); 
       } 
      }, false);