点击Android对话框以解除它?

Mic*_*Bak 38 java android themes dialog android-3.0-honeycomb

我想知道是否有可能以某种方式点击弹出对话框(或具有对话框主题的活动),并通过点击它之外来解雇它?

我做了一个快速的图片来说明它:

在此输入图像描述

通常情况下,您必须按后退键才能关闭对话框,但是在Honeycomb上,由于所有的屏幕区域,可以选择只在对话框外部进行操作.

Fra*_*amo 90

dialog.setCanceledOnTouchOutside(true) 
Run Code Online (Sandbox Code Playgroud)

设置在窗口边界外触摸时是否取消此对话框.

  • `this.setFinishOnTouchOutside(false);`适用于Dialog Activity (3认同)
  • 这是最好的解决方案......这么简单.为什么不是这个答案? (2认同)
  • 在`AlertDialog.Builder`中没有这样的方法,我不高兴. (2认同)

Jan*_* S. 47

我的应用程序是Theme.Holo.Dialog的单个活动.在我的情况下,另一个答案没有用.它只使其他后台应用程序或启动屏幕接收触摸事件.

我发现在我的情况下使用dispatchTouchEvent.我认为这也是一个更简单的解决方案.以下是一些示例代码,介绍如何使用Dialog主题检测活动外部的水龙头:

@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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你将if条件更改为`if(!dialogBounds.contains((int)event.getX(),(int)event.getY())&& event.getAction()== MotionEvent.ACTION_DOWN),这会更好用如果用户不小心将手指移到"活动"之外,它就不会关闭. (12认同)

Dha*_*dra 14

TouchInterceptor当你触摸弹出窗口的一侧时会有一个方法被调用

例如

mWindow.setTouchInterceptor(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    mWindow.dismiss();

                    return true;
                }

                return false;
            }
        });
Run Code Online (Sandbox Code Playgroud)

mWindow 是弹出窗口

如果您想要Activity的相同功能,您必须按照以下步骤操作.

1)在setContentView()调用方法之前添加标志onCreate();

 getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);

    // ...but notify us that it happened.
    getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
Run Code Online (Sandbox Code Playgroud)

2)覆盖onTouchEvent()活动中的事件

并写下面的代码

 @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                Toast.makeText(getApplicationContext(), "Finish", 3000).show();
                finish();               
                return true;
            }
            return false;
        }
Run Code Online (Sandbox Code Playgroud)

完整的副本在这里

活动

package net.londatiga.android;

import android.app.Activity;
import android.os.Bundle;

import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager.LayoutParams;

import android.widget.Button;
import android.widget.Toast;

public class NewQuickAction3DActivity extends Activity implements OnTouchListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         // Make us non-modal, so that others can receive touch events.
        getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);

        // ...but notify us that it happened.
        getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

        setContentView(R.layout.main);

    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
            Toast.makeText(getApplicationContext(), "Hi", 3000).show();

            return true;
        }

        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.londatiga.android"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".NewQuickAction3DActivity"
                  android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Dialog">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于'PopupWindow`,对吗?我正在使用Honeycomb中的Theme.Holo.Dialog主题的标准Activity. (2认同)

nmr*_*nmr 5

如果您的对话框是一个,您也可以使用Activity#setFinishOnTouchOutsideActivity.这是Activitys 的最短路径;)

(虽然它是API 11+.但API <= 10通常是屏幕尺寸正常.)


Amt*_*t87 5

你可以用

  dialog.setCancelable(true\false); 
Run Code Online (Sandbox Code Playgroud)

对于最新的Android游戏;

它将禁用outSideTouching事件.