web-dev-qa-db-ja.com

Android:戻るボタンがDialogFragmentをキャンセルしないようにする方法

DialogFragmentを作成してポップアップできるFragmentがありますが、[戻る]ボタンを押すと、明示的にsetCancelable(false)を呼び出してもダイアログが閉じられます。 DialogFragmentが[戻る]ボタンの影響を受けないようにする方法はありますか?

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

}

AsyncTaskからDialogFragmentを作成します。

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

setCancelable を使用してはどうですか?試しましたか?

ドキュメントから-

表示されたダイアログがキャンセル可能かどうかを制御します。 DialogFragmentはこれに基づいて動作を変更する必要があるため、Dialog.setCancelable(boolean)を直接呼び出す代わりにこれを使用します。

118
Lalit Poptani

これがFragmentDialogsで機能するかどうかはわかりませんが、setCancelableが機能しない場合は、この記事を見る価値があるかもしれません: Android:Prompt user [戻る]ボタンが押されたときに変更を保存するには

戻るボタンが押されたことを検出する方法を説明します。それで、あなたはボタンを押すことを抑えることができ、ダイアログが閉じるのを止めることができますか?

4
manavo

あなたを助けるかもしれません。

newFragment.setCancelable(false); 

dialogFragmentオブジェクトを作成するとき、または以下のサンプルのようにカスタムDialogFragmentのコンストラクターで上記のような変更を行います。

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