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

时间:2013-11-25 17:14:36

标签: android android-layout dialog android-xml android-dialog

如果我有一个将其主题设置为Theme.Holo.Light.Dialog的活动,则它会扩展得很好。它几乎完全以纵向模式填充在手机屏幕上,但在横向模式下,它不会长时间不合理地伸展。例如,在Google的这张图片中,您可以看到对话框没有填满整个屏幕。

enter image description here

它不会崩溃以匹配标题的宽度,如果你有一个扩展Dialog类的类有你自己的Dialog构建会发生什么。

这是我的布局会发生的事情。

enter image description here

我需要将哪些属性应用于LinearLayout以使其扩展得相当漂亮?

5 个答案:

答案 0 :(得分:26)

您可以使用Theme.Holo.Light.Dialog.MinWidth正确调整布局大小。

来自文档:

  

public static final int Theme_Holo_Light_Dialog_MinWidth

     

具有最佳宽度的Theme.Holo.Light.Dialog的变体   定期对话。

使用它的方法是将ContextThemeWrapper代替Context(使用它)传递给自定义Dialog的构造函数:

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:扪/ 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:扪/ 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

答案 1 :(得分:3)

只需在自定义主题中添加两个值即可。

<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>

E.g。

<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>

答案 2 :(得分:0)

在我的自定义对话框中,我使用以下属性并设置对话框宽度以匹配父级及其宽度比例。

 <item name="android:windowBackground">@null</item>
 <item name="android:windowIsFloating">false</item>

答案 3 :(得分:0)

两种情景

一个。如果您需要它来填充屏幕,请将您的父母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的其中一个孩子,然后设置 relative layouts width to match_parent

答案 4 :(得分:0)

您可以尝试在运行时更改Dialog维度,如下所示:

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

如果您使用碎片。