AlertDialog 样式 - 如何更改标题、消息等的样式(颜色)

Posted

技术标签:

【中文标题】AlertDialog 样式 - 如何更改标题、消息等的样式(颜色)【英文标题】:AlertDialog styling - how to change style (color) of title, message, etc 【发布时间】:2013-04-18 12:44:29 【问题描述】:

我已经为此烦恼了很久。我需要做的是,在我的 android 应用程序中更改所有 AlertDialogs 的样式 - 对话框背景需要是白色的,文本需要是黑色的。关于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 是 api11 alertDialogTheme 表示其他所有内容。 设置 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" 线路为我工作。 &lt;item name="android:textColorPrimary"&gt;@color/profileWhite&lt;/item&gt; 只编辑短信颜色。【参考方案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 的布局和字段

如何从 alertdialog 更改 mainactivity 中的可见性编辑文本

AlertDialog 更改片段中的背景颜色 [重复]

android alertDialog如何改变其样式,就是可以修改其背景,让背景为其他的颜色或背景图

024 Android 自定义样式对话框(AlertDialog)

Android:AlertDialog Button 不接受样式