2013-05-10 4 views
73

Sto lavorando in un'applicazione Android e sto usando un DialogFragment per mostrare una finestra di dialogo e voglio rendere quel DialogFragment non cancellabile. Ho reso falsa la proprietà cancellabile della finestra di dialogo, ma non ha ancora influito.DialogFragment setCancelable property not working

Si prega di guardare nel mio codice e suggerirmi una soluzione.

public class DialogTest extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     return super.onCreateDialog(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dialog_test, container, true); 
     getDialog().requestWindowFeature(STYLE_NO_TITLE); 
     getDialog().setCancelable(false); 

     return view; 
    } 
} 
+19

invece di getDialog() setCancelable (false); si dovresti chiamare setCancelable (false); – Blackbelt

+0

se fai clic al di fuori della finestra di dialogo deve essere anche dismmitato? –

+0

Stai provando in sandwich al gelato? Si prega di fare riferimento al link citato http://www.fantasypublishings.com/morePhpHelp/ice_cream_sandwich__android_40_Dialog_gets_canceled_when_touched_outside_of_dialog_window__Stack_Overflow_page93701 .php – Remmyabhavan

risposta

171
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    getDialog().setCancelable(false); 

    return view; 
} 

invece di voi getDialog().setCancelable(false); utilizzare direttamente setCancelable(false);

quindi la risposta aggiornata sarà così

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    setCancelable(false); 

    return view; 
} 
+0

Questo è un consiglio davvero incredibile, GRAZIE. Mi chiedo perché, con say * dialog.getWindow(). RequestFeature (-) * devi "includere la finestra di dialogo" in getWindow? – Fattie

+5

Non è un suggerimento. Un frammento sta avvolgendo la tua finestra di dialogo, è normale che devi gestire il frammento anziché la stessa finestra di dialogo;) –

+1

Se non si esegue l'override di onCreateView, il setCancelable (false) può anche essere chiamato dalla finestra di dialogo pubblica onCreateDialog (Bundle savedInstanceState) – user2924714

41

Utilizzare il seguente frammento

void showDialog() { 
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
      R.string..alert_dialog_two_buttons_title); 
    newFragment.setCancelable(false); 
    newFragment.show(getFragmentManager(), "dialog"); 
} 

e se si desidera disattivare il touch lato intorno utilizzo dialogo la seguente riga di codice

DialogFragment.getDialog().setCanceledOnTouchOutside(true); 
+1

Questa dovrebbe essere la risposta accettata così com'è applicabile sia per i frammenti della finestra di avviso di vaniglia sia per i frammenti di dialogo personalizzati. –

25

Nel caso in cui si utilizza builder avviso (e probabilmente in tutti i casi si avvolge dialogo all'interno di un DialogFragment) per aiutare a costruire la vostra finestra, si prega di non utilizzare getDialog () .setCancelable (false) o Dialog.setCancelable (false) perché non funzionerà. Usa setCancelable (false) come mostrato nel codice riportato di seguito come è indicato nella documentazione di Android oficial:

public void setCancelable (boolean cancelable) 

Aggiunto a livello di API 11 controllo se la finestra di dialogo mostrata è annullabile. Utilizzare questa invece di chiamare direttamente Dialog.setCancelable (booleano), perché DialogFragment ha bisogno di cambiare il suo comportamento sulla base di questo "

ref:.. http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.dialog_layout, null, false); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 
       .setTitle("in case you want use a title").setView(view); 

     AlertDialog alert = builder.create(); 
     // alert.setCancelable(false); <-- dont' use that instead use bellow approach 
     setCancelable(false); <- press back button not cancel dialog, this one works fine 
     alert.setCanceledOnTouchOutside(false); <- to cancel outside touch 

     return alert; 
} 
+0

Sì, provo sopra la soluzione, anche quella verificata ma non funziona per me, la risposta è nuova quindi ho bisogno di tempo per essere svalutato, Grazie comunque. – Xenione

+0

Beh, questo è vero, anche se penso che questo comportamento da parte di Android sia piuttosto strano, come si usa esplicitamente ad esempio AlertDialog.Builder per costruire la finestra di dialogo, si potrebbe pensare che quegli attributi sovrascrivano le sottoclassi. Ma forse mi manca qualcosa qui? – Robert

+0

Penso che il comportamento del dialogo dopo essere stato avvolto in un dialogfragment non risponda più a AlertDialog o al leat al bigining. Penso che tutto passi invece attraverso frammentDialog. – Xenione