La propriété DialogFragment setCancelable ne fonctionne pas

102

Je travaille dans une application Android et j'utilise un DialogFragment pour afficher une boîte de dialogue et je veux rendre ce DialogFragment non annulable. J'ai rendu la propriété annulable de la boîte de dialogue à false, mais cela n'affecte toujours pas.

Veuillez examiner mon code et me suggérer une solution.

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;
    }
 }
Arun
la source
28
au lieu de getDialog (). setCancelable (false); vous devez appeler setCancelable (false);
Blackbelt
si vous cliquez en dehors de la limite de la boîte de dialogue, il doit également être annulé?
Usman Kurd
Essayez-vous dans un sandwich à la crème glacée? Veuillez vous référer au lien mentionné fantasypublishings.com/morePhpHelp/…
Remmyabhavan

Réponses:

239
@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;
}

au lieu de getDialog().setCancelable(false);vous devez utiliser directementsetCancelable(false);

donc la réponse mise à jour sera comme ça

@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;
}
Ceinture noire
la source
C'est une astuce vraiment incroyable, MERCI. Je me demande pourquoi, avec par exemple dialog.getWindow (). RequestFeature (-) vous devez "inclure la boîte de dialogue" sur getWindow?
Fattie
7
Ce n'est pas une astuce. Un fragment enveloppe votre dialogue, il est normal que vous ayez à traiter le fragment au lieu du dialogue lui-même;)
andrea.rinaldi
1
Dans le cas où vous ne remplacez pas onCreateView, le setCancelable (false) peut également être appelé à partir du dialogue public onCreateDialog (Bundle savedInstanceState)
user2924714
2
Ne travaille pas pour moi. La boîte de dialogue est toujours rejetée en cliquant sur le bouton de retour.
Pinkesh Darji
@Blackbelt J'ai un cas d'utilisation similaire mais dans mon cas, une touche en dehors de la boîte de dialogue ne fait pas disparaître la boîte de dialogue. J'utilise un DatePicker dans DialogFragment. Qu'est-ce que j'utiliserais pour "R.layout.dialog_test" dans votre réponse ci-dessus? Ma question complète est répertoriée ici: stackoverflow.com/questions/59825258/…
AJW
52

Utilisez l'extrait de code suivant

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

et si vous souhaitez désactiver la boîte de dialogue tactile extérieur, utilisez la ligne de code suivante

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
Usman Kurd
la source
1
Cela devrait être la réponse acceptée car elle s'applique à la fois aux fragments de boîte de dialogue d'alerte vanille et aux fragments de boîte de dialogue personnalisés.
Ganesh Mohan
29

Si vous utilisez le générateur d'alertes (et probablement dans tous les cas, vous encapsulez une boîte de dialogue dans un DialogFragment) pour vous aider à construire votre boîte de dialogue, veuillez ne pas utiliser getDialog (). SetCancelable (false) ou Dialog.setCancelable (false) car cela ne va pas travail. Utilisez setCancelable (false) comme indiqué dans le code ci-dessous, comme indiqué dans la documentation officielle d'Android:

public void setCancelable (boolean cancelable)

Ajouté au niveau de l'API 11 Contrôlez si la boîte de dialogue affichée est annulable. Utilisez ceci au lieu d'appeler directement Dialog.setCancelable (boolean), car DialogFragment doit changer son comportement en fonction de cela. "

réf: 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;
}
Xenione
la source
Oui, j'essaie la solution ci-dessus, même celle cochée mais ne fonctionne pas pour moi, cette réponse est nouvelle, il faut donc du temps pour être votée, merci quand même.
Xenione
Eh bien c'est vrai, même si je pense que ce comportement du côté d'Android est assez étrange, comme vous utilisez explicitement par exemple AlertDialog.Builder pour construire votre dialogue, vous penseriez que ces attributs écrasent les sous-classes. Mais je manque peut-être quelque chose ici?
Robert
Je pense que le comportement du dialogue après avoir été enveloppé dans un fragment de dialogue ne répond plus à AlertDialog ou au moins au bigining. Je pense que tout passe par fragmentDialog à la place.
Xenione le
Merci! J'utilisais alert.setCancelable (false) pendant tout ce temps et je ne pouvais pas comprendre pourquoi cela ne fonctionnerait pas.
Aldo
0

Solution simple dans DialogFragment

Utilisé

dialog.setCanceledOnTouchOutside(false)
Mirza Adil
la source