ICS Holo对话框主题有什么问题?

18

我发现使用 Holo Dialog 主题(@android:style/Theme.Holo.Dialog)的活动在冰激凌三明治系统中存在一些奇怪的问题。

它们似乎忽略它们的布局并填充整个屏幕,而不是来自 XML 布局的布局宽度和高度。相同的布局在 Honeycomb 中按预期工作,但在 Ice Cream Sandwich 上不起作用。

示例:

正确的方式(Honeycomb) enter image description here

不正确的方式(Ice Cream Sandwich) enter image description here

两台设备都运行着应用程序的完全相同版本,并且使用完全相同的布局。这是相关的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout1"
    android:layout_width="940dp"
    android:layout_height="600dp"
    android:layout_margin="10dp" >

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="940dp"
        android:layout_height="600dp"
        android:horizontalSpacing="10dp"
        android:numColumns="3"
        android:smoothScrollbar="true"
        android:stretchMode="columnWidth"
        android:verticalSpacing="10dp" >
    </GridView>

</LinearLayout>
有什么想法可以解决这个问题吗?在我的基于ICS的Galaxy Nexus上也出现了类似的问题,它完全忽略了高度和宽度的match_parent标记。ICS中的对话框主题有问题吗?
更新:
我进行了更多测试,发现如果将宽度设置为894dp或更少,会产生“正确”的外观,但如果将宽度设置为895dp或更多,它会成为不正确的外观。模拟器表现相同。这太奇怪了... enter image description here

这似乎很奇怪。这只是一个猜测,但有时在更改构建目标后,我的应用程序会出现奇怪的图形故障。我不知道为什么,但清理项目总是可以解决它们。就像我说的,这只是一个猜测,但可能就是这么简单。 - adneal
谢谢,我刚刚再试了一次,但好像没有任何效果。我刚刚更新了我的问题 - 看起来它发生在 894 和 895 dp 的宽度之间。 - Michell Bak
你的屏幕截图是使用两个不同的设备拍摄的吗?你的帖子假定这种行为在HoneyComb上总是正常工作,但在ICS上不是,但问题可能完全取决于屏幕大小吗?如果不是,那么你可以考虑创建两个AVD(一个运行3.0,另一个运行4.0),具有完全相同的屏幕大小,并使用这两个进行测试,以确定问题是否实际上取决于Android SDK版本号。 - Alex Lockwood
@AlexLockwood 两种不同的设备,但它们使用完全相同的屏幕尺寸(xlarge,mdpi)。我还尝试使用SDK重建完全相同的AVD,并且实际上取决于Android的版本。正如您可以在下面看到的那样,处于Android开发团队的Sparky也遇到了同样的问题,而这个问题最近引起了很多关注,所以我的猜测是许多其他开发人员也注意到了这个错误。 - Michell Bak
你解决这个问题了吗?我在ICS上看到了同样的错误,但是在Jellybean上没有。所以我认为他们现在已经修复了它。但我想知道是否有一种解决ICS上这个问题的方法。 - Deepak Sarda
@antrix 抱歉,没有找到解决方案 :-( - Michell Bak
4个回答

6
我不认为ICS会阻碍对话框的使用。事实上,他们在Android设计页面上有一个完整的介绍。真正的情况是DialogFragment(甚至在Android支持库中提供)比传统的Dialog更受欢迎。
我证实了你关于对话框弹出全屏的观察,但这种行为取决于设备。在我的Xoom平板电脑上,它发生在915dp而不是895dp。在我的Galaxy Nexus上,它发生在444dp。在我的Galaxy Tab 10.1上,根本不会发生。
如果你深入研究源代码,你会发现有一个对话框主题,它是从Holo继承而来,用于较小的屏幕,而对于较大的屏幕,则是从Holo.Dialog.FixedSize继承而来。我本以为这应该是基于显示尺寸而不是布局尺寸,但或许我是错的。我将尝试找出导致跳跃的原因。

谢谢,那太棒了!我甚至不知道 Holo.Dialog.FixedSize 主题。 - Michell Bak
我遇到了同样的问题:使用Theme.Holo.Light.Dialog.NoActionBar主题的活动在JellyBean上表现正常,但在ICS上出现了上述“过度大小”的问题。 - Deepak Sarda

1

我自己找不到答案,最终放弃对话框主题,改用全宽标准主题布局。我认为 ICS 不鼓励使用对话框,所以可能这是改变的原因。


0
所有版本的 Android 忽略对话框主题布局 XML 的宽度/高度。
为了解决这个问题,在调用之后:
setContentView(R.layout.contacts_preferences);

添加一行:

getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

或者使用WRAP_CONTENT来满足您的需求。


0

尝试将您的LinearLayout替换为RelativeLayout。那就可以解决问题了 :)

不知何故,当在对话框中显示时,LinearLayouts总是填满整个屏幕。而RelativeLayouts则不会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接