关闭onTouchOutside上的DialogFragment(不是Dialog)

时间:2012-01-04 21:28:08

标签: android dialog android-fragments ontouchevent android-dialogfragment

我搜索了有关解除对话 onTouchOutside 的所有答案,但是,我在我的应用程序中使用 DialogFragment 。当用户在 DialogFragment 区域外点击时,如何解除 DialogFragment

我已经检查了对话source code setCanceledOnTouchOutside

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检查了应用程序的状态 据我了解,我只能看到对话框的区域,而不是它的外部部分(我的意思是 DialogFragment 后屏幕的剩余部分)。

你能否为 DialogFragment 建议一种实现 setCanceledOnTouchOutside 的方法,如果可能,还可以使用示例代码?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:11)

在大多数情况下,getDialog()为null,因为在创建对话框的新实例后,您将无法立即获取它。

如上所述,onViewCreatedDialogFragment也不正确,尤其是在使用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);
}

答案 2 :(得分:4)

为什么不覆盖onCreateDialog并将其设置在那里。这样您就不必一直在getDialog()呼叫上检查空值。

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

答案 3 :(得分:0)

我正在阅读:http://developer.android.com/reference/android/app/DialogFragment.html

它声明:“控制对话框(决定何时展示,隐藏,解除它)应该通过API在这里完成,而不是直接调用对话框。”

答案 4 :(得分:0)

我已经回答了另一个问题,但答案更适合这个问题,My solution。在此简要介绍一下,我只是实施了onTouch() DialogFragment getView() {{1}}并检查了触摸范围。