点击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:
-
使您的前景活动全屏。 Usenested布局:全屏布局应该有透明的背景(例如
@null
或@android:color/transparent
)。 内部布局应该有一个可见的背景。 -
将
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; } });