Mic*_*Bak 38 java android themes dialog android-3.0-honeycomb
我想知道是否有可能以某种方式点击弹出对话框(或具有对话框主题的活动),并通过点击它之外来解雇它?
我做了一个快速的图片来说明它:

通常情况下,您必须按后退键才能关闭对话框,但是在Honeycomb上,由于所有的屏幕区域,可以选择只在对话框外部进行操作.
Fra*_*amo 90
dialog.setCanceledOnTouchOutside(true)
Run Code Online (Sandbox Code Playgroud)
设置在窗口边界外触摸时是否取消此对话框.
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)
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)
如果您的对话框是一个,您也可以使用Activity#setFinishOnTouchOutsideActivity.这是Activitys 的最短路径;)
(虽然它是API 11+.但API <= 10通常是屏幕尺寸正常.)
你可以用
dialog.setCancelable(true\false);
Run Code Online (Sandbox Code Playgroud)
对于最新的Android游戏;
它将禁用outSideTouching事件.
| 归档时间: |
|
| 查看次数: |
31710 次 |
| 最近记录: |