Android 在外部关闭DialogFragment(非对话框)

Android 在外部关闭DialogFragment(非对话框),android,dialog,android-fragments,touch-event,android-dialogfragment,Android,Dialog,Android Fragments,Touch Event,Android Dialogfragment,我已经搜索了所有关于在TouchOutside上取消对话框的答案,但是,我在我的应用程序中使用了DialogFragment。当用户在对话框片段的区域之外单击时,我如何实现取消对话框片段的功能 我已经检查了对话框的设置取消到外部 public void setCanceledOnTouchOutside(boolean cancel) { if (cancel && !mCancelable) { mCancelable = true; }

我已经搜索了所有关于在TouchOutside上取消对话框的答案,但是,我在我的应用程序中使用了DialogFragment。当用户在对话框片段的区域之外单击时,我如何实现取消对话框片段的功能

我已经检查了对话框的设置取消到外部

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));
}
private boolean isOutOfBounds(运动事件){
final int x=(int)event.getX();
final int y=(int)event.getY();
final int slop=ViewConfiguration.get(mContext.getScaledWindowTouchSlop();
最终视图decorView=getWindow().getDecorView();
返回(x<-slop)| |(y<-slop)
||(x>(decorView.getWidth()+slop))
||(y>(decorView.getHeight()+slop));
}
但是我想不出一种方法来将这些应用于DialogFragment

除此之外,我还与您一起检查了申请的状态 据我所知,我只能看到对话框的区域,而不能看到对话框的外部部分(我指的是对话框片段之后屏幕的剩余部分)


您能为对话框片段提供一种实现此设置取消到外部的方法吗?如果可能,请使用示例代码?

答案非常简单:

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中对话框的更多信息,请参阅。

我正在阅读:

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

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

如上所述,
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);
}

为什么不直接重写onCreateDialog并将其设置在那里呢。这样,您就不必一直在
getDialog()
调用中检查null

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

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

DialogFragment
没有名为
setcanceledontouchout()的方法。
Dialog
有。请仔细阅读这个问题。以上答案并不意味着它有
DialogFragment
具有方法
getDialog()
,该方法返回
Dialog
,该方法具有方法
setcanceledontouchout()
。请仔细阅读答案。。请描述得更详细些。。如果你能修改答案,我可以投票表决。我在自定义的DialogFragment实现的
onCreateView()
中调用了它,它工作得很好。谢谢。我发现我需要在蜂巢上添加对SecancedOnTouchOutside(true)的调用,但在ICS上没有。我认为更好的答案是让对话框片段子类控制它是否应该被取消。在onCreateDialog或onCreateView中似乎是这样做的好地方。请在DialogFragment中重写此方法。这一点最初并不清楚,因为它通常在片段中被重写。@ericosg我使用的是androidx.fragment.app.DialogFragment,上面的答案在我的DialogFragment中不起作用。我的测试设备使用Android 8.0 Oreo,我的用例如下:。有没有关于如何修复的想法?