我想以一个对话框开始一个活动,可以通过以下方式完成:
<activity android:theme="@android:style/Theme.Dialog">
但我想控制对话框,所以我要以编程方式进行操作。基本上我想修改对话框的这个属性:
mCanceledOnTouchOutside = true
当触摸到界外时,这会使对话框自动取消。 (基本上我想复制弹出行为)。问题是我不能简单地创建一个对话框并设置它的布局,因为我需要调用活动(初始化数据集)
这可能吗?
答案 0 :(得分:2)
这实际上并不是因为活动不是对话。通过设置主题,您所做的只是使活动可视地使用对话框的主题。然而,它仍然是一项活动,将所有正常的活动行为。换句话说,没有Dialog对象及其相关行为。
答案 1 :(得分:1)
我只是想在我的一个Dialog风格的Activity上重现这个cancelOutside Dialog行为。为此,我提取了处理触摸事件的Dialog源代码(Dialog.java):
public boolean onTouchEvent(MotionEvent event) {
if (mCancelable && mCanceledOnTouchOutside && event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(event)) {
cancel();
return true;
}
return false;
}
private boolean isOutOfBounds(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop) || (x > (decorView.getWidth()+slop)) || (y > (decorView.getHeight()+slop));
}
我将它粘贴到我的Dialog样式活动中并更改了一些小东西:
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(event)) {
finish();
return true;
}
return false;
}
private boolean isOutOfBounds(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(this).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop) || (x > (decorView.getWidth() + slop)) || (y > decorView.getHeight() + slop));
}
一切正常!
答案 2 :(得分:0)
您可以定义自己的样式,在Theme.Dialog
文件中扩展values/styles.xml
(或任何您想要调用的文件)。查看http://developer.android.com/guide/topics/ui/themes.html#Inheritance。
我不确定这是否有用,但可能会尝试类似:
<style name="DialogCancelOnTouchOutside" parent="@android:style/Theme.Dialog">
<item name="android:canceledOnTouchOutside">true</item>
</style>