AlertDialog 样式 - 如何更改标题、消息等的样式(颜色)
Posted
技术标签:
【中文标题】AlertDialog 样式 - 如何更改标题、消息等的样式(颜色)【英文标题】:AlertDialog styling - how to change style (color) of title, message, etc 【发布时间】:2013-04-18 12:44:29 【问题描述】:我已经为此烦恼了很久。我需要做的是,在我的 android 应用程序中更改所有 AlertDialog
s 的样式 - 对话框背景需要是白色的,文本需要是黑色的。关于AlertDialog
中的文本颜色,我尝试从代码、清单等创建很多样式、主题和应用,但没有成功。现在,我有最简单的代码,设置如下:
清单:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
styles.xml:
<style name="AppTheme" parent="AppBaseTheme"> <item name="android:alertDialogStyle">@style/DialogStyle</item> </style> <style name="DialogStyle" parent="@android:style/Theme.Dialog"> <!-- changing these background stuff works fine --> <item name="android:bottomBright">@android:color/white</item> <item name="android:bottomDark">@android:color/white</item> <item name="android:bottomMedium">@drawable/dialog_footer_bg</item> <item name="android:centerBright">@android:color/white</item> <item name="android:centerDark">@drawable/dialog_body_bg</item> <item name="android:centerMedium">@android:color/white</item> <item name="android:fullBright">@color/orange</item> <item name="android:fullDark">@color/orange</item> <item name="android:topBright">@color/green</item> <item name="android:topDark">@drawable/dialog_header_bg</item>
下面列出的项目不起作用(请阅读我在每个元素上方放置的 cmets):
<!-- panelBackground is not getting set to null, there is something squarish around it --> <item name="android:panelBackground">@null</item> <!-- Setting this textColor doesn't seem to have any effect at all. Messages, title, button text color, whatever; nothing changes. --> <item name="android:textColor">#000000</item> <!-- Also tried with textAppearance, as follows. Didn't work --> <item name="android:textAppearance">?android:attr/textColorPrimaryInverse</item> <!-- Also tried changing textAppearancePrimary, to no avail --> <item name="android:textColorPrimary">#000000</item> <!-- Also need to change the dialog title text, tried it as follows, dint work: --> <item name="android:windowTitleStyle">@style/DialogWindowTitle</item> </style>
DialogWindowTitle 定义如下:
<style name="DialogWindowTitle"> <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item> </style>
所以这些都不起作用。谁能告诉我我做错了什么,我该怎么做:
-
更改消息的文本颜色(内容文本)
更改标题文本颜色
删除
面板背景
注意:我需要向上支持 API 8 (2.2)。另外,我在这里和谷歌群组中查看了大部分相关问题,但无法弄清楚,虽然我感觉它就在我的鼻子底下!
编辑:添加截图:
【问题讨论】:
你能提供一张它目前的外观截图吗? @Ahmad:已添加屏幕截图 我想知道你是如何改变这些背景颜色的。使用完全相同的代码,我无法针对 API 级别 9 复制彩色 AlertDialog。您是否以某种特殊方式应用了主题或样式?您的目标和最低 sdk 级别设置为多少? 奇怪...不知何故我让它工作了,我不知道怎么做。非常感谢这篇文章,我为此挠了好几个小时。对于任何搜索的人来说,这个问题/答案是在 Android API 级别自定义 AlertDialogs 的权威方法 ...但由于某种原因,如果我在任何运行 Android >= 3.0 的设备上运行此代码,对话框颜色不会改变。因此,对于 >2.3.3 和 【参考方案1】:您需要为您的 AlertDialog 定义一个主题并在您的活动主题中引用它。该属性是alertDialogTheme
而不是alertDialogStyle
。像这样:
<style name="Theme.YourTheme" parent="@android:style/Theme.Holo">
...
<item name="android:alertDialogTheme">@style/YourAlertDialogTheme</item>
</style>
<style name="YourAlertDialogTheme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
<item name="android:windowTitleStyle">...</item>
<item name="android:textAppearanceMedium">...</item>
<item name="android:borderlessButtonStyle">...</item>
<item name="android:buttonBarStyle">...</item>
</style>
您将能够更改标题、消息的颜色和文本外观,并且您可以对每个区域的背景进行一些控制。我写了一个 blog post 详细说明了设置 AlertDialog 样式的步骤。
【讨论】:
博客文章让我得到了我所需要的。我应该一直使用 android:textColorPrimary 和 android:textColorAlertDialogListItem 来设置对话框内容的样式。 alertDialogTheme 是 api11alertDialogTheme
表示其他所有内容。
设置 android:textAppearanceMedium
在使用应用程序兼容性警报对话框时对我不起作用:***.com/questions/35179537/…
使用 Material 主题是正确的,您不能使用 android:textAppearanceMedium
更改内容样式,请参阅此线程以获取解决方法***.com/questions/35179537/…【参考方案2】:
移除面板背景
<item name="android:windowBackground">@color/transparent_color</item>
<color name="transparent_color">#00000000</color>
这是我的风格:
<style name="ThemeDialogCustom">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowBackground">@color/transparent_color</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="android:colorBackgroundCacheHint">@null</item>
</style>
我已添加到构造函数中。
添加文本颜色:
<item name="android:textColor">#ff0000</item>
【讨论】:
name="android:textColor"
线路为我工作。 <item name="android:textColorPrimary">@color/profileWhite</item>
只编辑短信颜色。【参考方案3】:
这是我的代码来设置警报对话框的主题:
<style name="alertDialog" parent="Theme.AppCompat.Dialog.Alert">
<item name="android:background">@color/light_button_text_color</item>
<item name="android:textColor">@android:color/black</item>
<item name="android:textColorPrimary">@android:color/black</item>
<item name="android:textColorSecondary">@android:color/black</item>
<item name="android:titleTextColor" tools:targetApi="m">@android:color/black</item>
</style>
将此代码放在styles.xml 中。 在您的 java 中将此主题应用为:
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.alertDialog);
Output of the code
【讨论】:
【参考方案4】:您必须将样式添加到对话框的构造函数中
builder = new AlertDialog.Builder(this, R.style.DialogStyle);
【讨论】:
请注意,此构造函数的使用仅在 API 级别 11+ 中可用 你说得对,我找了好几天都没有解决办法。因此,我在 xml 中使用带有自定义视图的基本对话框。像这样final ContextThemeWrapper l_contextThemeWrapper = new ContextThemeWrapper(this, R.style.myDialogStyle ); dialog = new Dialog(l_contextThemeWrapper); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.dialog);
【参考方案5】:
我以这种方式以编程方式更改颜色:
var builder = new AlertDialog.Builder (this);
...
...
...
var dialog = builder.Show ();
int textColorId = Resources.GetIdentifier ("alertTitle", "id", "android");
TextView textColor = dialog.FindViewById<TextView> (textColorId);
textColor?.SetTextColor (Color.DarkRed);
作为alertTitle,您可以通过这种方式更改其他数据(下一个示例是titleDivider):
int titleDividerId = Resources.GetIdentifier ("titleDivider", "id", "android");
View titleDivider = dialog.FindViewById (titleDividerId);
titleDivider?.SetBackgroundColor (Color.Red);
这是在 C# 中,但在 java 中是一样的。
【讨论】:
这是java版本的代码-int textColorId = getResources().getIdentifier("alertMessage", "id", "android"); TextView textColor = (TextView) alertDialog.findViewById(textColorId); if (textColor != null) textColor.setTextColor(Color.RED);
【参考方案6】:
这取决于您想要自定义警报对话框的程度。我有不同的步骤来自定义警报对话框。请访问:https://***.com/a/33439849/5475941
【讨论】:
【参考方案7】:基于@general03 的回答,您可以使用Android 的内置样式快速自定义对话框。您可以在android.R.style.Theme_DeviceDefault_Dialogxxx
下找到对话框主题。
例如:
builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_MinWidth);
builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_NoActionBar);
builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_DialogWhenLarge);
【讨论】:
【参考方案8】:在您的 values-v21/style.xml
中的样式中使用它<style name="AlertDialogCustom" parent="@android:style/Theme.Material.Dialog.NoActionBar">
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowActionBar">false</item>
<item name="android:colorAccent">@color/cbt_ui_primary_dark</item>
<item name="android:windowTitleStyle">@style/DialogWindowTitle.Sphinx</item>
<item name="android:textColorPrimary">@color/cbt_hints_color</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>
对于棒棒糖之前的设备,将其放入 values/style.xml
<style name="AlertDialogCustom" parent="@android:style/Theme.Material.Dialog.NoActionBar">
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowActionBar">false</item>
<item name="android:colorAccent">@color/cbt_ui_primary_dark</item>
<item name="android:windowTitleStyle">@style/DialogWindowTitle.Sphinx</item>
<item name="android:textColorPrimary">@color/cbt_hints_color</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>
<style name="DialogWindowTitle.Sphinx" parent="@style/DialogWindowTitle_Holo">
<item name="android:textAppearance">@style/TextAppearance.Sphinx.DialogWindowTitle</item>
</style>
<style name="TextAppearance.Sphinx.DialogWindowTitle" parent="@android:style/TextAppearance.Holo.DialogWindowTitle">
<item name="android:textColor">@color/dark</item>
<!--<item name="android:fontFamily">sans-serif-condensed</item>-->
<item name="android:textStyle">bold</item>
</style>
【讨论】:
以上是关于AlertDialog 样式 - 如何更改标题、消息等的样式(颜色)的主要内容,如果未能解决你的问题,请参考以下文章
如何从 alertdialog 更改 mainactivity 中的可见性编辑文本
android alertDialog如何改变其样式,就是可以修改其背景,让背景为其他的颜色或背景图