自定义对话框大小以匹配 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】:两种场景
一个。如果您需要它来完全填满屏幕,请将您的父母 minWidth
和 minHeight
设置为 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的主要内容,如果未能解决你的问题,请参考以下文章