Android:如何防止后退按钮取消对话框片段

Android:如何防止后退按钮取消对话框片段,android,android-asynctask,progressdialog,fragment,back-button,Android,Android Asynctask,Progressdialog,Fragment,Back Button,我有一个片段可以创建并弹出一个DialogFragment,但是当我点击后退按钮时,它会关闭对话框,即使我显式地调用setCancelable(false);有没有办法让我的DialogFragment对后退按钮不起作用 public class LoadingDialogFragment extends DialogFragment { String title; String msg; public LoadingDialogFragment() {

我有一个片段可以创建并弹出一个DialogFragment,但是当我点击后退按钮时,它会关闭对话框,即使我显式地调用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;
    }

}
我从异步任务创建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();
    }
}
私有类GpsTask扩展异步任务
{
//进程对话;
@凌驾
受保护的void onPreExecute()
{
FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
DialogFragment newFragment=新加载DialogFragment(“收集位置”,“获取GPS锁…”);
ft.addToBackStack(空);
newFragment.show(ft,“dialog”);
}
@凌驾
受保护的整数doInBackground(字符串…参数)
{
//获取GPS锁并获取一些位置更新
}
@凌驾
受保护的void onProgressUpdate(整数…输入){}
@凌驾
受保护的void onPostExecute(整数结果)
{
getSupportFragmentManager();
}
}
如何使用?你试过了吗

来自文档-

控制显示的对话框是否可取消。用这个代替 直接调用Dialog.setCancelable(布尔值),因为DialogFragment 需要基于此更改其行为


我完全不确定这是否适用于FragmentDialogs,但如果setCancelable不适用于您,可能值得一看这篇文章:

它解释了如何检测正在按下的后退按钮。因此,您可以抑制按钮的按下,从而停止对话框关闭?

这可能会对您有所帮助

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

这是正确的!事实证明,您必须对DialogFragment本身调用setCancelable(false),而不是它所持有的内部对话框@马特夫:这句话是救命稻草。没有意识到我需要在
对话框fragment
上调用
setCancelable()
,而不是在
进程对话框中调用。谢谢我在Kotlin中使用了
isCancelable=false
,在创建的视图中使用了
!!它也适用于我@Seven,我使用isCancelable=false(不是dialog.setCancelable(false))我使用的是
getDialog.setCancelable(false)
但它不起作用,但我用
setCancelable(false)
替换了它,它工作正常。这是weirdI最后给出的另一个答案,但我确实认为这也有效,非常感谢