2011-12-06 7 views
57

Sto usando un DialogFragment e mentre ho impostato correttamente un'immagine per chiudere (cioè chiudere) la finestra di dialogo quando premuto, sto avendo difficoltà a trovare il modo di chiudere la finestra di dialogo quando l'utente fa clic in un punto qualsiasi all'esterno, proprio come funziona con normali finestre di dialogo. Ho pensato che ci sarebbe stata una specie diCome chiudere un DialogFragment quando si preme all'esterno della finestra di dialogo?

dialogFragment.setCanceledOnTouchOutside(true); 

chiamata, ma non la vedo nella documentazione.

Ciò è possibile con DialogFragment? O sto cercando nei posti sbagliati? Ho provato a intercettare gli eventi di tocco nell'attività "genitore" ma, a parte il fatto che non ricevevo alcun evento di tocco, non mi sembrava giusto.

risposta

136
DialogFragment.getDialog().setCanceledOnTouchOutside(true); 

devono essere chiamati a onCreateView (come Apurv Gupta ha sottolineato).

+26

Deve essere chiamato in 'onCreateView' –

+0

Cosa succede se non desidero che si annulli ma invece si chiuda? – jjxtra

50
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ... 
     getDialog().setCanceledOnTouchOutside(true); 
     ... 
     } 
1
DialogFragment.getDialog().setCanceledOnTouchOutside(false); 

Fu errori di digitazione. Ho avuto lo stesso problema. Questo funziona bene per Java e Mono Mono per Android sarà:

this.getDialog().SetCanceledOnTouchOutside(false); 
18
/** The system calls this only when creating the layout in a dialog. */ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // The only reason you might override this method when using onCreateView() is 
     // to modify any dialog characteristics. For example, the dialog includes a 
     // title by default, but your custom layout might not need it. So here you can 
     // remove the dialog title, but you must call the superclass to get the Dialog. 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     dialog.setCanceledOnTouchOutside(true); 

     return dialog; 
    } 
+0

questo non ha funzionato per me. Ho dovuto chiamare 'setCanceledOnTouchOutside' in' onCreateView' come per @Apurv. Devo dire che ho chiamato 'setCanceledOnTouchOutside (false)' – kimbaudi

0

Suggerirei di usare la mia unica soluzione dopo aver provato le soluzioni di cui sopra. Ho descritto la mia soluzione here. Solo per breve, sto controllando i limiti di tocco di DialogFragment.getView(). Quando i punti di tocco sono al di fuori di DialogFragment, sto chiudendo la finestra di dialogo.

0
  Dialog.SetCanceledOnTouchOutside(true); 

ha funzionato per me
My Code

class dlgRegister : DialogFragment 
     { 
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 
    .... 
    .... 
    } 
    public override void OnActivityCreated(Bundle savedInstanceState) 
      { 
       Dialog.Window.RequestFeature(WindowFeatures.NoTitle); 
       Dialog.SetCanceledOnTouchOutside(true); 
       base.OnActivityCreated(savedInstanceState); 
       Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation; 
      } 
    } 
+0

Sei vicino ma non è giusto! – sud007

2

sacco di risposte qui, ma, il crollo app quando apre la finestra. La scrittura getDialog().setCanceledOnTouchOutside(true); all'interno di onCreateView non ha funzionato e ha bloccato la mia app.

(Sto usando AppCompatActivity come BaseActivity e android.app.DialogFragment come mio frammento).

Ciò che funziona è una delle due seguenti righe:

getDialog() setCanceledOnTouchOutside (true);.

O

this.getDialog() setCanceledOnTouchOutside (true).;

all'interno onActivityCreated come

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom; 
     //getDialog().getWindow().setDimAmount(0.85f); 
     getDialog().setCanceledOnTouchOutside(true);//See here is the code 
    } 

Cosa non usare:

DialogFragment.getDialog().setCanceledOnTouchOutside (false);

tiri seguente errore

enter image description here

e scrivere il codice nella onCreateView crash App! Si prega di aggiornare la risposta se trovate qualcosa di sbagliato.

Problemi correlati