19

我已經經歷了所有關於解聘但是一個對話框onTouchOutside,答案搜索,我使用DialogFragment在我的應用程序。當用戶單擊DialogFragment的區域時,如何取消DialogFragment解僱DialogFragment(不是對話框)onTouchOutside

我已經研究對話框source codesetCanceledOnTouchOutside

public void setCanceledOnTouchOutside(boolean cancel) { 
    if (cancel && !mCancelable) { 
     mCancelable = true; 
    } 

    mCanceledOnTouchOutside = cancel; 
} 

有可能是有趣的是isOutOfBounds

private boolean isOutOfBounds(MotionEvent event) { 
    final int x = (int) event.getX(); 
    final int y = (int) event.getY(); 
    final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop(); 
    final View decorView = getWindow().getDecorView(); 
    return (x < -slop) || (y < -slop) 
    || (x > (decorView.getWidth()+slop)) 
    || (y > (decorView.getHeight()+slop)); 
} 

,但我想不出其他功能使用這些方法的一種方法DialogFragment

除了這些我已經檢查應用程序的狀態hierarchyviewer 並按照我的理解,我只能看到對話框的區域,而不是它的outsied部分(我指的剩餘部分在DialogFragment之後的屏幕)。

您能否提供用於實施DialogFragment,如果可能,這setCanceledOnTouchOutside與樣本代碼的方式?

回答

34

答案很簡單:

MyDialogFragment fragment = new MyDialogFragment(); // init in onCreate() or somewhere else 
... 
if (fragment.getDialog() != null) 
    fragment.getDialog().setCanceledOnTouchOutside(true); // after fragment has already dialog, i. e. in onCreateView() 

有關DialogFragments對話框的詳細信息,請參閱http://developer.android.com/reference/android/app/DialogFragment.html#setShowsDialog%28boolean%29

+0

'DialogFragment'沒有一個名爲'setCanceledOnTouchOutside()''Dialog'的方法。請仔細閱讀問題。 – 2012-02-14 14:49:39

+12

以上回答並不意味着它有。 'DialogFragment'具有方法'getDialog()',它返回'Dialog',它的HAS方法'setCanceledOnTouchOutside()'。請仔細閱讀答案。 – 2012-02-14 15:05:46

+3

哦,男人..請更具描述性..如果你可以編輯答案,我可以upvote它。我已經在自定義的'DialogFragment'實現的'onCreateView()'內部調用了它,並且它工作正常。謝謝。 – 2012-02-14 15:33:09

10

在大多數情況下,getDialog()爲null,因爲在創建對話框的新實例後,您不會立即得到它。

如上建議onViewCreated對於DialogFragment也是不正確的,特別是當使用android.support.v4.app.DialogFragment時。下面

的效果很好,因爲它是放置在onCreateView

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if (getDialog() != null) { 
     getDialog().setCanceledOnTouchOutside(true); 
    } 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 
+1

應該被接受的答案 – Kibi 2017-01-08 14:05:16

+0

在DialogFragment中重寫此方法。最初並不清楚,因爲它通常在片段中被覆蓋。 – Ivan 2017-05-17 18:49:40

4

爲什麼不只是覆蓋onCreateDialog,只是在此設置。這樣您就不必一直檢查getDialog()的空值。

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog d = super.onCreateDialog(savedInstanceState); 
    d.setCanceledOnTouchOutside(false); 
    return d; 
} 
0

我已經回答了另一個問題,但這個問題的答案是更適合於這個問題,My solution。只是在這裏簡要介紹一下,我簡單地實施了onTouch()DialogFragmentgetView()並勾選了觸摸範圍。

相關問題