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

Posted

技术标签:

【中文标题】自定义对话框大小以匹配 Theme.Holo.Light.Dialog【英文标题】:Custom Dialog size to match Theme.Holo.Light.Dialog 【发布时间】:2013-12-10 12:51:50 【问题描述】:

如果我有一个主题设置为Theme.Holo.Light.Dialog 的活动,它的规模会很大。它将在纵向模式下几乎完全填满手机的屏幕,但在横向模式下,它不会拉伸得过长。例如,在这张来自 Google 的图片中,您可以看到对话框没有填满整个屏幕。

它也不会折叠以匹配标题的宽度,就像您通过扩展 Dialog 类来构建自己的 Dialog 那样。

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

我需要对 LinearLayout 应用哪些属性才能使其缩放得漂亮?

【问题讨论】:

你能发布你的自定义对话框 XML 吗? @Indiandroid 我将代码发布到 Pastebin 中。 pastebin.com/Mx4rkjaF 您可以通过计算设备高度和宽度以编程方式设置对话框布局的宽度。 @Indiandroid 可能,但我认为主题设置为 Theme.Dialog 的活动不会发生这种情况 +1 来自我。我可以看到。但理想情况下不应该这样。 【参考方案1】:

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

来自文档:

public static final int Theme_Holo_Light_Dialog_MinWidth

Theme.Holo.Light.Dialog 的变体,具有很好的最小宽度 常规对话。

使用 this 的方法是通过将 ContextThemeWrapper 代替 Context(使用 this)传递给自定义 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: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 %,但比以前好多了:):

【讨论】:

嘿,谢谢。它绝对比我拥有的更好,但它仍然与我的活动不匹配,它的主题设置为@android:style/Theme.Holo.Light.Dialog。这里有一些图片。底部的对话框是正确的。 s24.postimg.org/7dzk6dbt1/device_2013_12_01_130746.png s18.postimg.org/6hkao2pnd/device_2013_12_01_130722.png 我还需要将我的自定义主题应用于对话框(以更改微调器、搜索栏等的颜色),所以你不觉得这有点糟糕吗?我不能有多个主题。我可以以某种方式将其应用到我自己的主题中吗? @MikkoP 我对您正在寻找的输出有几个问题。让我们continue this exchange in chat。 嘿,正如我们所讨论的,我需要为我的对话框应用自定义主题。我的布局中的搜索栏和微调器不仅是布局,而且是主题。我用theme generator 构建了这个版本。如果我使用Theme.Holo.Light.Dialog.MinWidth,你知道我该如何应用这个主题吗? @MikkoP 是的,我可以帮你。让我们talk here。 @MikkoP 您能否解决 Spinner 在单独的弹出窗口而不是下拉列表中显示其选项的问题?【参考方案2】:

只需向您的自定义主题添加两个值。

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

【讨论】:

【参考方案3】:

在我的自定义对话框中,我使用以下属性并设置对话框宽度以匹配父级,并且它的宽度缩放正确。

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

【讨论】:

set it's width scale properly 是什么意思。而这两行代码去哪了? 在 style.xml 中放这个。 并将对话框样式设置为CustomDialogTheme,宽度设置为match_parent。 这将填满整个屏幕。如果我将windowIsFloating 设置为true,它将折叠以匹配布局中的第一个TextView。【参考方案4】:

您能否尝试在运行时更改对话框尺寸,如下所示:

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

如果您使用片段。

【讨论】:

我可以在代码中更改它,但这也不会设置宽度以匹配原始对话框宽度。【参考方案5】:

两种场景

一个。如果您需要它来完全填满屏幕,请将您的父母 minWidthminHeight 设置为 1000dp

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

b.如果您需要它在不填满整个屏幕的情况下进行缩放。在RelativeLayout 中设置LinearLayout 的一个子级,并设置relative layouts width to match_parent

【讨论】:

以上是关于自定义对话框大小以匹配 Theme.Holo.Light.Dialog的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义对话框大小[重复]

调整 MFC 网格控件的大小以适应对话框?

使用自定义布局将宽度和高度设置为 AlertDialog 无法正确应用

带有动画更改的自定义进度对话框的大小

如何使用自定义布局创建对话框弹出窗口?

在fastReport中怎样使用自定义的纸张大小