Proprietà DialogFragment setCancelable non funzionante


101

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 impostato la proprietà cancellabile della finestra di dialogo su false, ma ancora non ha effetto.

Per favore controlla il mio codice e suggeriscimi 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;
    }
 }

28
invece di getDialog (). setCancelable (false); dovresti chiamare setCancelable (false);
Blackbelt

se clicchi al di fuori del confine della finestra di dialogo, anche questo deve essere disattivato?
Usman Kurd

Stai provando un panino con il gelato? Fai riferimento al link menzionato fantasypublishings.com/morePhpHelp/…
Remmyabhavan

Risposte:


238
@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 getDialog().setCancelable(false);usare direttamentesetCancelable(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;
}

È un suggerimento davvero incredibile, GRAZIE. Mi chiedo perché, con say dialog.getWindow (). RequestFeature (-) devi "includere la finestra di dialogo" su getWindow?
Fattie

7
Non è un suggerimento. Un frammento sta avvolgendo il tuo dialogo, è normale che tu debba occuparti del frammento invece del dialogo stesso;)
andrea.rinaldi

1
Nel caso in cui non si sovrascriva onCreateView, setCancelable (false) può anche essere chiamato dalla finestra di dialogo pubblica onCreateDialog (Bundle savedInstanceState)
user2924714

2
Non funziona per me. La finestra di dialogo viene comunque chiusa facendo clic sul pulsante Indietro.
Pinkesh Darji

@Blackbelt Ho un caso d'uso simile ma nel mio caso un tocco al di fuori della finestra di dialogo non chiude la finestra di dialogo. Sto usando un DatePicker all'interno di DialogFragment. Cosa userei per "R.layout.dialog_test" nella tua risposta sopra? La mia domanda completa è elencata qui: stackoverflow.com/questions/59825258/…
AJW

51

Usa 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 disabilitare la finestra di dialogo tocco intorno all'esterno, utilizzare la seguente riga di codice

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
Questa dovrebbe essere la risposta accettata in quanto è applicabile sia ai frammenti di finestre di dialogo di avviso vanilla che ai frammenti di dialogo personalizzati.
Ganesh Mohan

29

Nel caso in cui utilizzi il generatore di avvisi (e probabilmente in ogni caso avvolgi il dialogo all'interno di un DialogFragment) per aiutare a costruire il tuo dialogo, per favore non usare getDialog (). SetCancelable (false) o Dialog.setCancelable (false) perché non funzionerà lavoro. Usa setCancelable (false) come mostrato nel codice di seguito come menzionato nella documentazione ufficiale di Android:

public void setCancelable (boolean cancelable)

Aggiunto nel livello API 11 Controlla se la finestra di dialogo mostrata è cancellabile. Usa questo invece di chiamare direttamente Dialog.setCancelable (boolean), perché DialogFragment deve modificare il suo comportamento in base a questo. "

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

Sì, provo la soluzione sopra, anche quella selezionata ma non funziona per me, quella risposta è nuova quindi ho bisogno di tempo per essere votata, grazie comunque.
Xenione

Bene, questo è vero, anche se penso che questo comportamento da parte di Android sia piuttosto strano, poiché usi esplicitamente ad esempio AlertDialog.Builder per costruire la tua finestra di dialogo, penseresti che quegli attributi sovrascrivono le sottoclassi. Ma forse mi manca qualcosa qui?
Robert,

Penso che il comportamento del dialogo dopo essere stato avvolto in un frammento di dialogo non risponda più ad AlertDialog o almeno all'inizio. Penso che tutto vada invece attraverso fragmentDialog.
Xenione

Grazie! Stavo usando alert.setCancelable (false) per tutto questo tempo e non riuscivo a capire perché non funzionasse.
Aldo

0

Soluzione semplice in DialogFragment

Usato

dialog.setCanceledOnTouchOutside(false)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.