Android:如何防止后退按钮取消对话框片段
我有一个片段可以创建并弹出一个DialogFragment,但是当我点击后退按钮时,它会关闭对话框,即使我显式地调用setCancelable(false);有没有办法让我的DialogFragment对后退按钮不起作用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() {
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最后给出的另一个答案,但我确实认为这也有效,非常感谢