点击Android对话框以解除它?

我想知道是否有可能以外popup一个对话框(或一个对话框主题的活动),并通过只是轻拍外面呢?

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

在这里输入图像说明

通常情况下,您必须按回退键才能closures对话框,但在Honeycomb上,由于所有屏幕属性,只需轻敲对话框就可以了。

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

我发现使用dispatchTouchEvent在我的情况下工作。 我认为这也是一个更简单的解决scheme。 下面是一些示例代码,介绍如何使用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); } 
 dialog.setCanceledOnTouchOutside(true) 

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

有一个TouchInterceptor方法,当你在popup窗口的外面触摸时会被调用

例如

 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是popup窗口

如果您需要与“活动”相同的function,则必须按照以下步骤进行操作。

1)在onCreate();调用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> 

如果你的对话框是一个Activity ,你也可以使用Activity#setFinishOnTouchOutside 。 这应该是Activity s的最短path;)

(虽然是API 11+,但API <= 10通常是正常的屏幕大小。)

你可以使用

  dialog.setCancelable(true\false); 

对于Android的最新版本;

它将禁用outSideTouching事件。

只要我写dialog.setCanceledOnTouchOutside(false); 它为我工作,窗口不会解雇外面的水龙头。

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

老问题,但又一个解决scheme:

  1. 使您的前景活动全屏。 Usenested布局:全屏布局应该有透明的背景(例如@null@android:color/transparent )。 内部布局应该有一个可见的背景。

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

使用对话框样式而不是其他样式。

例如,使用

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

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

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

我加了这个,它在3.0以上完美的工作,但应该工作的一切。

this.setFinishOnTouchOutside(假);

你可以使用这个

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

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