Android活动:外部触摸事件的监听器

时间:2013-12-04 12:29:59

标签: java android android-activity android-dialog onactivityresult

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

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

当用户通过触摸活动对话窗口外部关闭活动对话框时,活动结束。

如何在此活动中设置监听器?

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

setResult(intResultCode, intent);

在完成之前。

在onPause()中调用setResult()可能为时已晚。

3 个答案:

答案 0 :(得分:3)

为什么要那么挣扎?只需覆盖Activity ...

中的finish()方法
@Override
public void finish() {
    setResult(int resultCode, Intent data);
    super.finish();
}

答案 1 :(得分: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);
}

答案 2 :(得分: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);
    ...
}