1

我有一个显示为对话框的活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.setTheme(android.R.style.Theme_Dialog);
    setFinishOnTouchOutside(true);
}

当用户通过触摸 Activity-Dialog 窗口外关闭 Activity-Dialog 时,Activity 结束。

如何在此事件上设置侦听器?

这很重要,因为我希望能够打电话

setResult(intResultCode, intent);

就在完成之前。

在 onPause() 中调用 setResult() 可能已经太晚了。

4

3 回答 3

4

为什么要这么挣扎?只需覆盖 Avtivity 中的 finish() 方法...

@Override
public void finish() {
    setResult(int resultCode, Intent data);
    super.finish();
}
于 2013-12-04T12:56:12.847 回答
0

先放

dialog.setCanceledOnTouchOutside(true) 

之后使用

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    Rect dialogBounds = new Rect();
    getWindow().getDecorView().getHitRect(dialogBounds);

    if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
        // Tapped outside so we finish the activity
        this.finish();
    }
    return super.dispatchTouchEvent(ev);
}
于 2013-12-04T12:36:52.410 回答
0

这是可能的。您可以覆盖onTouchEvent()

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (MotionEvent.ACTION_OUTSIDE == event.getAction()) {
        // Your logic
        // return true if you don't want to pass event further
    }
    return super.onTouchEvent(event);
}

如果你没有得到ACTION_OUTSIDE事件,可能你需要添加FLAG_NOT_TOUCH_MODALFLAG_WATCH_OUTSIDE_TOUCH窗口标志。没有它对我有用。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    ...
}
于 2018-04-09T16:38:47.060 回答