在不使用主题修饰符的情况下将Android活动作为对话框启动

时间:2010-09-23 00:33:31

标签: android dialog themes android-activity

我想以一个对话框开始一个活动,可以通过以下方式完成:

<activity android:theme="@android:style/Theme.Dialog">

但我想控制对话框,所以我要以编程方式进行操作。基本上我想修改对话框的这个属性:

mCanceledOnTouchOutside = true

当触摸到界外时,这会使对话框自动取消。 (基本上我想复制弹出行为)。问题是我不能简单地创建一个对话框并设置它的布局,因为我需要调用活动(初始化数据集)

这可能吗?

3 个答案:

答案 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>