我想知道是否有可能以某种方式点击弹出对话框(或带有对话框主题的活动),然后通过点击它来忽略它?
我做了一个快速的图片来说明它:
通常情况下,您必须按后退键才能关闭对话框,但是在Honeycomb上,由于所有的屏幕区域,可以选择只在对话框外部进行操作。
答案 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)
旧问题,但另一种解决方案:
让您的前台活动全屏显示。使用的布局:全屏布局应具有透明背景(例如@null
或@android:color/transparent
)。内部布局应该有可见的背景。
将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上完美无缺,但应该适用于所有。