自定义对话框大小以匹配Theme.Holo.Light.Dialog

11

如果我有一个Activity,它的主题设置为Theme.Holo.Light.Dialog,它会很好地适应屏幕大小。在竖屏模式下,它几乎可以填满手机屏幕,但在横屏模式下不会拉伸得过长。例如,在谷歌的这张图片中,您可以看到对话框没有填满整个屏幕。

图像描述

如果您使用继承Dialog类的类自己构建对话框,它也不会折叠以适应标题的宽度。

这就是我的布局会发生的情况。

图像描述

我需要应用哪些属性来使LinearLayout缩放得漂亮?


你能发布你的自定义对话框XML吗? - TheFlash
@Indiandroid 我已将代码发布到 Pastebin。http://pastebin.com/Mx4rkjaF - MikkoP
您可以通过计算设备的高度和宽度来编程设置对话框布局的宽度。 - TheFlash
@Indiandroid 可能是这样,但我不认为这是发生在将主题设置为Theme.Dialog的活动中的情况。 - MikkoP
+1 我能看到,但理想情况下不应该出现。 - TheFlash
5个回答

27

您可以使用 Theme.Holo.Light.Dialog.MinWidth 来正确设置布局的大小。

根据文档:

  

public static final int Theme_Holo_Light_Dialog_MinWidth

      

Theme.Holo.Light.Dialog 的变体,为常规对话框提供了良好的最小宽度。

使用此方法的方式是通过将 ContextThemeWrapper 传递给自定义 Dialog 的构造函数中的 Context (使用 this)的位置:

YourCustomDialog cDialog = new YourCustomDialog(
                        new ContextThemeWrapper(this, 
                              android.R.style.Theme_Holo_Light_Dialog_MinWidth));

这是Theme.Holo.Light.Dialog.MinWidth的定义方式:

<style name="Theme.Holo.Light.Dialog.MinWidth">
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

来自 dimens.xml 文件:

@android:dimen/dialog_min_width_major:

<!-- The platform's desired minimum size for a dialog's width when it
     is along the major axis (that is the screen is landscape).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_major">65%</item>

@android:dimen/dialog_min_width_minor:

<!-- The platform's desired minimum size for a dialog's width when it
     is along the minor axis (that is the screen is portrait).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_minor">95%</item>

看起来,你发的图片中对话框的宽度大约是65%。在纵向模式下,它会是95%。

老实说,在纵向模式下,宽度看起来不像是95%,但比以前好了:)

enter image description here


嘿,谢谢你。这肯定比我之前的好,但它仍然不能与我的Activity匹配,因为它的主题设置为@android:style/Theme.Holo.Light.Dialog。这里有一些图片。底部的对话框是正确的。http://s24.postimg.org/7dzk6dbt1/device_2013_12_01_130746.png http://s18.postimg.org/6hkao2pnd/device_2013_12_01_130722.png 我还需要将我的自定义主题应用于对话框(以更改旋转器、拖动条等的颜色),所以这有点糟糕,不是吗?我不能有多个主题。我能否以某种方式将其实现到自己的主题中? - MikkoP
@MikkoP 我有几个问题关于您正在寻找的输出。让我们在聊天中继续这个交流 - Vikram
嘿,正如我们所讨论的,我需要为我的对话框应用一个自定义主题。不仅是布局,还有布局中的seekbars和spinners的主题。我有一个主题生成器来构建这个主题。如果我使用“Theme.Holo.Light.Dialog.MinWidth”,您知道我如何应用这个主题吗? - MikkoP
@MikkoP 是的,我可以帮你。让我们在这里聊聊(http://chat.stackoverflow.com/rooms/42277/custom-dialog-size-to-match-theme-holo-light-dialog)。 - Vikram
@MikkoP 你能解决 Spinner 显示选项于弹出窗口而非下拉列表的问题了吗? - Vikram
我在XML中为下拉菜单添加了android:spinnerMode="dropdown",现在它们正常工作了。不过Eclipse并不太满意:Resouce id 0x1010081 is not of type STYLE (instead attr) - MikkoP

3
只需在您的自定义主题中添加两个值即可。
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>

例如。
<style name="MyDialog" parent="ThDialogBase">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
        <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

0
在我的自定义对话框中,我使用以下属性,并将对话框宽度设置为与父级匹配,并且其宽度比例适当。
 <item name="android:windowBackground">@null</item>
 <item name="android:windowIsFloating">false</item>

“set it's width scale properly”是什么意思?这两行代码放在哪里? - MikkoP
请在 style.xml 文件中添加以下内容:<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog"> <item name="android:windowBackground">@color/overlay_background</item> <item name="android:windowIsFloating">false</item> <item name="android:windowNoTitle">true</item> </style> 并将对话框的样式设置为 CustomDialogTheme,宽度设置为 match_parent。 - vipul mittal
这将填满整个屏幕。如果我将 windowIsFloating 设置为 true,则会折叠以匹配布局中的第一个 TextView。 - MikkoP

0

两种情况

a. 如果您需要将其完全填充屏幕,请将父元素的minWidthminHeight设置为1000dp

LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:minWidth="1000dp"  
    android:minHeight="1000dp"

如果您需要它在不填充整个屏幕的情况下进行缩放,请将您的LinearLayout的一个子项设置为RelativeLayout,并将相对布局的宽度设置为match_parent。

0
你能否尝试在运行时更改对话框的尺寸,像这样:
DisplayMetrics metrics = getResources().getDisplayMetrics();
int width = metrics.widthPixels;
yourDialog.show();
yourDialog.getWindow().setLayout((6 * width)/7, LayoutParams.WRAP_CONTENT);

或者

Dialog yourDialog = dialogFragment.getDialog();
yourDialog.getWindow().setLayout((6 * width)/7, (4 * height)/5);

如果你使用Fragments。


我可以在代码中更改它,但这样并不能将宽度设置为与原始对话框的宽度相匹配。 - MikkoP

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