19

我已经搜索了有关关闭 Dialog onTouchOutside的所有答案,但是,我在我的应用程序中使用了 DialogFragment。当用户在DialogFragment区域之外单击时,如何实现关闭DialogFragment

我检查了DialogsetCanceledOnTouchOutside源代码

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的方法,并在可能的情况下使用示例代码?

4

5 回答 5

36

答案很简单:

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 。

于 2012-02-14T14:11:40.873 回答
11

在大多数情况下,getDialog() 为空,因为您不会在创建对话框的新实例后立即得到它。

如上所述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);
}
于 2013-12-13T11:19:39.203 回答
5

为什么不直接覆盖onCreateDialog并将其设置在那里。这样您就不必一直在getDialog()通话中检查 null。

 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState) {
     Dialog d =  super.onCreateDialog(savedInstanceState);
     d.setCanceledOnTouchOutside(false);
     return d;
 }
于 2014-11-22T07:35:26.543 回答
0

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

它指出:“对话框的控制(决定何时显示、隐藏、关闭它)应该通过这里的 API 来完成,而不是直接调用对话框。”

于 2013-09-05T21:21:09.553 回答
0

我已经回答了另一个问题,但这个答案更适合这个问题,我的解决方案。在这里简单介绍一下,我只是简单地实现onTouch()DialogFragment'sgetView()并检查了触摸边界。

于 2015-01-20T10:38:58.330 回答