【问题标题】:What's wrong with the ICS Holo Dialog theme?ICS Holo Dialog 主题有什么问题?
【发布时间】:2012-02-06 16:16:07
【问题描述】:

我在 Ice Cream Sandwich 中使用 Holo Dialog 主题 (@android:style/Theme.Holo.Dialog) 的活动遇到了一个奇怪的问题。

似乎他们忽略了他们的布局并填满了整个屏幕,而不是他们 XML 布局的布局宽度和高度。相同的布局在 Honeycomb 中正常工作,但在 Ice Cream Sandwich 上却没有。

示例:

正确的方法(蜂窝)

不正确的做法(冰淇淋三明治)

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

<?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 或更大,它会是不正确的外观。模拟器的行为方式相同。这太奇怪了……

【问题讨论】:

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

标签: android android-3.0-honeycomb android-4.0-ice-cream-sandwich android-dialog


【解决方案1】:

我不认为 ICS 不鼓励对话。事实上,他们有一个完整的page at Android Design。事实是,DialogFragment(甚至在Android Support library 中提供)优于旧版Dialog

我证实了您对弹出全屏对话框的观察,但行为取决于设备。在我的 Xoom 平板电脑上,它发生在 915dp,而不是 895。在我的 Galaxy Nexus 上,它发生在 444dp。而在我的 Galaxy Tab 10.1 上,它根本不会发生。

如果您深入研究源代码,您会发现有一个 Dialog 主题,它是从 Holo 派生的小屏幕和 Holo.Dialog.FixedSize 的大屏幕。我原以为这是基于显示尺寸,而不是布局尺寸,但也许我会弄错了。我会尝试找出导致跳跃的原因。

【讨论】:

  • 谢谢,太好了!甚至不知道 Holo.Dialog.FixedSize 主题。
  • 我看到了同样的问题:使用 Theme.Holo.Light.Dialog.NoActionBar 主题的活动在 JellyBean 上表现正确,但在 ICS 上出现上述“尺寸过大”问题。
【解决方案2】:

我自己找不到这个问题的答案,所以我最终放弃了对话框主题,而是使用了全角标准主题布局。我认为 ICS 不鼓励使用对话框,所以也许这就是它改变的原因。

【讨论】:

    【解决方案3】:

    所有版本的 Android 都会忽略 Dialog 主题布局 xml 的宽度/高度。

    要解决这个问题,调用后:

    setContentView(R.layout.contacts_preferences);
    

    添加一行:

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

    WRAP_CONTENT 满足您的需求。

    【讨论】:

      【解决方案4】:

      尝试将您的 LinearLayout 换成 RelativeLayout。这样就行了:)

      LinearLayouts 在对话框中显示时总是以某种方式填满屏幕。相对布局没有。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多