点击Android对话框以解除它?

时间:2011-08-27 11:54:16

标签: java android dialog themes android-3.0-honeycomb

我想知道是否有可能以某种方式点击弹出对话框(或带有对话框主题的活动),然后通过点击它来忽略它?

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

enter image description here

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

12 个答案:

答案 0 :(得分:89)

dialog.setCanceledOnTouchOutside(true) 

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

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

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

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);

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;
        }

完整副本在这里

<强>活动

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;
    }
}

这是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>

答案 3 :(得分:5)

如果您的对话框是Activity,也可以使用Activity#setFinishOnTouchOutside。这必须是Activity s的最短路径;)

(虽然它是API 11+。但API&lt; = 10通常是屏幕尺寸正常。)

答案 4 :(得分:5)

您可以使用

  dialog.setCancelable(true\false); 

对于最新版本的Android;

它将禁用outSide Touch事件。

答案 5 :(得分:4)

我只想写dialog.setCanceledOnTouchOutside(false);它对我有用,窗户不会在外面轻拍。

答案 6 :(得分:3)

    dialog = new Dialog(MainActivity.this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.dialog_layout);
    dialog.getWindow().setBackgroundDrawableResource(
            android.R.color.transparent);
    dialog.setCancelable(false);

    dialog.setCanceledOnTouchOutside(true);

检查您是否有这行代码......

    dialog.setCanceledOnTouchOutside(true);

答案 7 :(得分:1)

旧问题,但另一种解决方案:

  1. 让您的前台活动全屏显示。使用的布局:全屏布局应具有透明背景(例如@null@android:color/transparent)。内部布局应该有可见的背景。

  2. OnClickListener添加到finish() es活动的不可见外部布局中。

答案 8 :(得分:1)

使用对话框的风格而不是其他风格。

例如,使用

public YourCustomDialog(Context context) {
    super(context, android.R.style.Theme_Holo_dialog_NoActionBar);
}

当您使用 Theme_Translucent_NoTitleBar 等其他样式时,对话框不会被解除。

答案 9 :(得分:1)

this.setFinishOnTouchOutside(假);

你可以用这个

答案 10 :(得分:0)

对话框中的任何视图都可以设置为使用触摸事件,以便不会调用下面的内容。

onCreate(){
    getWindow().getDecorView().getRootView().setOnTouchListener(new OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            dialog.dismiss();
            return false;
        }
    });

答案 11 :(得分:0)

LayoutParams lp=dialogp.getWindow().getAttributes(); 
lp.flags=LayoutParams.FLAG_LAYOUT_NO_LIMITS;

我添加了这个,它在3.0上完美无缺,但应该适用于所有。