2013-05-10 318 views
73

我在android應用程序中工作,並使用DialogFragment顯示一個對話框,我想使該DialogFragment不可取消。我已將對話可取消的屬性設置爲false,但仍然不受影響。DialogFragment setCancelable屬性不起作用

請看看我的代碼,並給我一個解決方案。

public class DialogTest extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     return super.onCreateDialog(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dialog_test, container, true); 
     getDialog().requestWindowFeature(STYLE_NO_TITLE); 
     getDialog().setCancelable(false); 

     return view; 
    } 
} 
+19

代替getDialog()setCancelable(假的);你應該調用setCancelable(false); – Blackbelt 2013-05-10 10:34:52

+0

如果你點擊對話框的邊界之外它也必須被刪除? – 2013-05-10 10:35:35

+0

你在嘗試冰淇淋三明治嗎?請參考提到的鏈接http://www.fantasypublishings.com/morePhpHelp/ice_cream_sandwich__android_40_Dialog_gets_canceled_when_touched_outside_of_dialog_window__Stack_Overflow_page93701 .php – Remmyabhavan 2013-05-10 10:45:40

回答

171
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    getDialog().setCancelable(false); 

    return view; 
} 

,而不是getDialog().setCancelable(false);你OUT側觸摸必須直接使用setCancelable(false);

所以更新的答案會是這樣

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    setCancelable(false); 

    return view; 
} 
+0

這是一個真正令人難以置信的小費,感謝。我想知道爲什麼,用say * dialog.getWindow()。requestFeature( - )*你必須在getWindow中包含「對話框」? – Fattie 2014-06-05 07:42:50

+5

這不是小費。一個片段包裝你的對話框,這是正常的,你必須處理片段,而不是對話框本身;) – 2015-05-13 15:07:34

+1

如果你不重寫onCreateView,setCancelable(false)也可以從公共對話框onCreateDialog調用( Bundle savedInstanceState) – user2924714 2015-11-15 08:57:35

41

使用下面的代碼片段

void showDialog() { 
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
      R.string..alert_dialog_two_buttons_title); 
    newFragment.setCancelable(false); 
    newFragment.show(getFragmentManager(), "dialog"); 
} 

,如果要禁用圍繞對話框使用下面的代碼行

DialogFragment.getDialog().setCanceledOnTouchOutside(true); 
+1

這應該是公認的答案適用於香草警報對話框片段和自定義對話框片段。 – 2017-05-15 21:44:02

25

如果您在使用警報生成器(也可能是在任何情況下,你換一個DialogFragment內部對話),以幫助建立你的對話框,請不要使用getDialog( ).setCancelable(false)或Dialog.setCancelable(false),因爲它不起作用。 使用setCancelable(假),如圖代碼下面因爲它公報Android文檔中提到:

public void setCancelable (boolean cancelable) 

在API級別11 控制所示的對話框是否取消。使用此而不是直接調用Dialog.setCancelable(布爾),因爲DialogFragment需要在此基礎上,以改變其行爲「

參考:。http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.dialog_layout, null, false); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 
       .setTitle("in case you want use a title").setView(view); 

     AlertDialog alert = builder.create(); 
     // alert.setCancelable(false); <-- dont' use that instead use bellow approach 
     setCancelable(false); <- press back button not cancel dialog, this one works fine 
     alert.setCanceledOnTouchOutside(false); <- to cancel outside touch 

     return alert; 
} 
+0

是的我嘗試以上的解決方案,即使是選中的一個,但不適合我,這個答案是新的,所以需要時間來提高,謝謝。 – Xenione 2014-08-27 08:04:43

+0

這是真的,即使我認爲Android的這種行爲很奇怪,例如你明確使用AlertDialog.Builder構建對話框,你會認爲這些屬性會覆蓋子類。但我可能在這裏錯過了什麼? – Robert 2014-09-26 21:04:00

+0

我覺得對話框行爲被封裝在一個dialogfragment中後不再對AlertDialog作出響應,或者在bigining中處於休眠狀態。我認爲所有的都經歷了fragmentDialog。 – Xenione 2014-09-27 15:42:04