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

问题描述:

我有一个片段,可以创建并弹出一个DialogFragment,但是当我点击后退按钮时,即使我显式调用setCancelable(false),它也会关闭对话框。有没有办法让我的DialogFragment对后退按钮不敏感?Android:如何防止后退按钮取消FragmentDialog

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创建FragmentDialog:

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

有关使用setCancelable如何?你试过了吗?

从文件 -

控制所示的对话框是否取消。使用此而不是 直接调用Dialog.setCancelable(布尔),因为DialogFragment 需要在此基础上

+29

这是正确的!事实证明,你必须在DialogFragment本身调用setCancelable(false),而不是它保存的内部对话框! – MattF 2012-04-16 10:02:47

+1

@MattF这个评论是一种生活救星。没有意识到我需要在'DialogFragment'而不是'ProgressDialog'上调用'setCancelable()'。谢谢! – prolink007 2015-09-22 15:40:26

我一点儿也不知道这将与FragmentDialogs工作,改变自己的行为,但如果setCancelable没有为你工作,这可能是值得看看这篇文章:Android: Prompt user to save changes when Back button is pressed

它解释了如何检测被按下的后退按钮。所以,也许你可以抑制按钮按下,它会停止关闭对话框?

+0

我结束了与其他答案,但我确实认为这工作得很好,非常感谢 – MattF 2012-04-16 10:03:17

它可以帮助你。

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