【问题标题】:Starting an Android activity as a dialog without using a theme modifier在不使用主题修饰符的情况下将 Android Activity 作为对话框启动
【发布时间】:2010-09-23 00:33:30
【问题描述】:

我想以对话框的形式启动一个活动,这可以通过以下方式完成:

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

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

mCanceledOnTouchOutside = true

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

这可能吗?

【问题讨论】:

    标签: android dialog themes android-activity


    【解决方案1】:

    这实际上并没有,因为活动不是对话框。通过设置主题,您所做的就是使活动直观地使用对话框的主题。它仍然是一个活动,但是,将所有正常活动行为。换句话说,没有 Dialog 对象及其相关行为。

    【讨论】:

    • 非常感谢,它消除了我对使用对话框主题开始的活动的困惑。
    【解决方案2】:

    我只是想在我的一个 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));
    }
    

    我将其复制粘贴到我的对话框样式活动中并更改了一些小东西:

    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));
    }
    

    效果很好!

    【讨论】:

      【解决方案3】:

      您可以在values/styles.xml 文件(或任何您想调用的名称)中定义您自己的扩展Theme.Dialog 的样式。查看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>
      

      【讨论】:

      • 不幸的是,这不起作用,因为 mcanceledOnTouchOutside 是私有的。当我们将对话框/透明主题应用到它时,任何想法android如何加载活动?它肯定必须创建 Dialog 类的实例并在加载活动后将视图注入其中。如果我们可以修改这种行为,它就可以解决。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2021-10-22
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多