40

我有一個片段,可以創建並彈出一個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(); 
    } 
} 

回答

94

有關使用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

4

我一點兒也不知道這將與FragmentDialogs工作,改變自己的行爲,但如果setCancelable沒有爲你工作,這可能是值得看看這篇文章:Android: Prompt user to save changes when Back button is pressed

它解釋瞭如何檢測被按下的後退按鈕。所以,也許你可以抑制按鈕按下,它會停止關閉對話框?

+0

我結束了與其他答案,但我確實認爲這工作得很好,非常感謝 – MattF 2012-04-16 10:03:17

1

它可以幫助你。

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