如何为活动(对话框主题)设置最大高度

4

我正在优化我们的Android平板应用程序。对于大部分应用程序,我们使用片段(fragments),但对于某些设置屏幕,我们只想在平板电脑上以对话框的形式启动该屏幕。为了实现这一点,我们在清单文件中设置了Activity的主题。

<activity
    android:name="com.company.app.EditTaxTypeSettingsActivity"
    android:theme="@style/ActivityTheme">
</activity>

这里是主题(在res/values-large-v11文件夹中):

<?xml version="1.0" encoding="utf-8"?>
<resources>         
    <style name="ActivityTheme" parent="@android:style/Theme.Holo.Light.Dialog">      
    <item name="android:windowIsFloating">true</item>
    </style>
</resources>

使用此主题的活动在横向方向上以对话框形式打开,看起来很好。但在纵向模式下,对话框会垂直填充屏幕,这看起来很愚蠢。
我该如何设置这些对话框的最大高度?我尝试了设置主题的maxHeight属性 <item name="android:maxHeight">500dip</item> 但似乎是指对话框容器而不是对话框内容本身的高度。(即,如果我将Activity主题的高度设置为500dip,则对话框只会得到一个非常大的对话框标题区域)
我还尝试设置活动布局xml(RelativeLayout)的大小,但我不能设置maxHeight,我只能设置高度,但我无法在那里硬编码高度,因为我已将保存和取消按钮设置为 android:layout_alignParentBottom="true" ,以便当键盘弹出时它们仍然位于键盘上方。(硬编码活动布局高度会阻止保存/取消按钮保持在键盘顶部)
谢谢,有人知道如何在主题级别上设置最大对话框高度吗?

我不明白为什么你会单独使用 Fragment 作为 Dialog。直接使用 DialogFragment 就好了,它会正确地调整大小以适应你想要展示的内容。 - Andy
哦,好的,我明白了。所以你的意思是你仍然会有Activities,但你希望手机设计的Activities在平板电脑上变成对话框? - Andy
@Andy 是的。它已经像这样工作了,但我只是希望我可以以某种方式设置这些对话框的最大高度,以便在纵向模式下不会看起来很傻,占据整个屏幕的高度。 - Dittimon
我相信我告诉你的方法在你的情况下可能真的有效。它将涉及的Activity封装成一个对话框,使其更像应该是的样子,即使在平板电脑上也是如此。老实说,只需将其从“Activity”更改为“Fragment”或“DialogFragment”。需要更改的代码非常少。实际上还有一种叫做“FragmentActivity”的东西。查看一下这些内容,这样你就知道我的意思了。这会更有意义。另外,随时可以访问我的Github,查看“DialogFragment”的示例。但无论如何,如果不行,我只是想提供一些替代方案。 - Andy
关于在“Dialog”中设置最大高度,我查看了文档,没有属性可以实现这一点。所以回答你的问题,没有办法设置最大高度。你需要使用“Fragments”。 - Andy
显示剩余2条评论
1个回答

2
使用此方法来固定使用对话框主题的活动窗口的高度。
public static void maxinumDialogWindowHeight(Window window) {
    WindowManager.LayoutParams layout = new WindowManager.LayoutParams();
    layout.copyFrom(window.getAttributes());
    layout.height = WindowManager.LayoutParams.FILL_PARENT;
    window.setAttributes(layout);
}

setContentView()之后使用它(它将重置窗口布局为wrap_content):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.messages);
    if (getWindow().isFloating()) ViewHelper.maxinumDialogWindowHeight(getWindow());

    // rest of your code...
}

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