web-dev-qa-db-fra.com

Android: comment empêcher le bouton de retour d'annuler un DialogFragment

J'ai un fragment qui peut créer et afficher un DialogFragment, mais quand je clique sur le bouton de retour, il rejette la boîte de dialogue même si j'appelle explicitement setCancelable (false); Existe-t-il un moyen pour mon DialogFragment d'être insensible au bouton Retour?

public class LoadingDialogFragment extends DialogFragment
{
    String title;
    String msg;

    public LoadingDialogFragment()
    {
        this.title = "Loading...";
        this.msg = "Please wait...";
    }
    public LoadingDialogFragment(String title, String msg)
    {
        this.title = title;
        this.msg = msg;
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState)
    {
        final ProgressDialog dialog = new ProgressDialog(getActivity());

        dialog.setTitle(title);
        dialog.setMessage(msg);
        dialog.setIndeterminate(true);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);

        return dialog;
    }

}

Je crée le DialogFragment à partir d'une AsyncTask:

private class GpsTask extends AsyncTask<String, Integer, Integer>
{
    //ProgressDialog dialog;
    @Override
    protected void onPreExecute()
    {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock...");
        ft.addToBackStack(null);
        newFragment.show(ft, "dialog");
    }

    @Override
    protected Integer doInBackground(String... params)
    {
        //acquire a GPS lock and grab a few position updates
    }

    @Override
    protected void onProgressUpdate(Integer... input) { }

    @Override
    protected void onPostExecute(Integer result)
    {
        getSupportFragmentManager().popBackStackImmediate();
    }
}
46
MattF

Que diriez-vous d'utiliser setCancelable ? L'avez-vous essayé?

À partir de la documentation -

Contrôlez si la boîte de dialogue affichée peut être annulée. Utilisez ceci au lieu d'appeler directement Dialog.setCancelable (boolean), car DialogFragment doit changer son comportement en fonction de cela

118
Lalit Poptani

Je ne suis pas du tout sûr que cela fonctionnera avec FragmentDialogs, mais si setCancelable ne fonctionnait pas pour vous, il pourrait être utile de consulter cet article: Android: invite l'utilisateur à enregistrer les modifications lors du retour bouton est enfoncé

Il explique comment détecter le bouton de retour enfoncé. Alors peut-être pouvez-vous supprimer la pression sur le bouton et cela empêchera la fermeture de la boîte de dialogue?

4
manavo

Cela peut vous aider.

newFragment.setCancelable(false); 

apportez les modifications comme ci-dessus lors de la création d'un objet DialogFragment ou dans le constructeur de DialogFragment personnalisé comme dans l'exemple ci-dessous.

public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener)
        {
            CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();            
            CustomClearHourDialog.listener = listener;
            clearHourDialog.setCancelable(false);
            return clearHourDialog;
        }
3
Karthikeyan Ve