Android:如何防止后退按钮取消DialogFragment

Mat*_*ttF 46 android back-button fragment progressdialog android-asynctask

我有一个可以创建并弹出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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我从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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Lal*_*ani 118

怎么用setCancelable?你试过吗?

来自文件 -

控制显示的Dialog是否可取消.使用它而不是直接调用Dialog.setCancelable(boolean),因为DialogFragment需要根据此更改其行为

  • 这是对的!事实证明你必须在DialogFragment本身上调用setCancelable(false),而不是它所拥有的内部Dialog! (37认同)
  • 我在 Kotlin 中使用了 `isCancelable = false`,在 `onViewCreated` 里面,它奏效了!! (3认同)
  • @MattF 这个评论是救命稻草。没有意识到我需要在“DialogFragment”而不是“ProgressDialog”上调用“setCancelable()”。谢谢! (2认同)