【问题标题】:Custom Dialog size to match Theme.Holo.Light.Dialog自定义对话框大小以匹配 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 来自我。我可以看到。但理想情况下不应该这样。

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


【解决方案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_width="match_parent" 
        android:layout_height="match_parent" 
        android:minWidth="1000dp"  
        android:minHeight="1000dp"
    

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

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多