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

40

我已经花费了很多时间思考这个问题。 我需要做的是更改我的Android应用程序中所有 AlertDialog 的样式 - 对话框背景需要是白色,文本需要是黑色。 我尝试创建了许多样式、主题,并从代码、清单等应用,但对于 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>
下面列出的项目不起作用(请阅读我在每个元素上方放置的注释):
    <!-- 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>
所以这些都不起作用。有人能告诉我我可能做错了什么,以及如何:
  1. 更改消息的文本颜色(内容文本)
  2. 更改标题文本颜色
  3. 删除面板背景
注意:我需要支持API 8(2.2)以上。此外,我已经查看了大多数相关问题,并在Google群组中进行了搜索,但无法弄清楚,尽管我有一种感觉就在我的鼻子底下!
编辑:添加截图:

你能提供一张当前界面的截图吗? - Ahmad
@Ahmad:已添加截图。 - Aswin Kumar
我想知道你是如何改变背景颜色的。使用完全相同的代码,我无法在API级别9上复制有颜色的AlertDialog。你是通过应用主题或特殊方式来设置样式的吗?你的目标和最小SDK级别设置是什么? - moonlightcheese
奇怪...不知怎么的,我终于让它工作了,但我完全不知道为什么。非常感谢这篇文章,我为此苦思冥想了数小时。对于任何正在寻找答案的人来说,这个问题/答案是在Android API级别<11中自定义AlertDialog的明确方法。 - moonlightcheese
1
但不知何故,如果我在运行 Android >= 3.0 的设备上运行此代码,则对话框颜色不会改变。 因此,在 >2.3.3 和 <2.3.3 的情况下必须以两种不同的方式处理它...也许要使用单独的 APK?这真是一团糟…在 Android 版本之间,他们真的搞砸了这个。 - moonlightcheese
@moonlightcheese 我认为DialogStyle下的属性仅适用于非基于片段的对话框,这就是为什么它们在蜂蜜柚子设备上不起作用的原因。您不需要多个apk,而只需为基于片段的对话框定义其他属性即可。它们不会互相干扰,如果它们会干扰,您可以随时使用资源限定符。请查看Dadou的答案以查看新对话框的主题和相关样式。 - mdelolmo
8个回答

50

你需要为你的AlertDialog定义一个主题,并在Activity的主题中引用它。属性是alertDialogTheme而不是alertDialogStyle。像这样:

你需要为AlertDialog定义一个主题并在Activity的主题中引用它。属性是 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>

您将能够更改标题、消息的颜色和文本外观,并对每个区域的背景有一定的控制。我编写了一篇博客文章,详细介绍了如何为AlertDialog设置样式。


4
博客文章给了我所需的答案。我应该使用android:textColorPrimary和android:textColorAlertDialogListItem来设置对话框内容的样式。 - Nlinscott
1
alertDialogTheme 是 api11。 - sherpya
alertDialogTheme 意味着其他所有内容。 - zionpi
1
当使用应用兼容的警示对话框时,设置 android:textAppearanceMedium 对我不起作用:https://dev59.com/eFsW5IYBdhLWcg3wSFfW - Tomask
使用Material主题,您不能使用android:textAppearanceMedium来更改内容样式,请参考此线程以获取解决方法https://dev59.com/eFsW5IYBdhLWcg3wSFfW#36749547 - Sergio Serra
但是如何更改按钮的字体类型? - Dr.jacky

14

移除面板背景

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

1
name="android:textColor" 这一行对我有用。<item name="android:textColorPrimary">@color/profileWhite</item> 只编辑了文本消息的颜色。 - LadyWoodi

10

这是我的代码,用于设置警告对话框的主题:

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

代码输出结果


9
您需要将样式添加到对话框的构造函数中。
builder = new AlertDialog.Builder(this, R.style.DialogStyle);

请注意,此构造函数仅适用于API级别11+。 - moonlightcheese
你说得对,我已经寻找了几天的解决方案,但是没有结果。所以我使用了一个基本的对话框,并在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); - general03

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

作为警报标题,你可以通过以下方式更改其他数据(下一个示例是用于titleDivider):
int titleDividerId = Resources.GetIdentifier ("titleDivider", "id", "android");
View titleDivider = dialog.FindViewById (titleDividerId);
titleDivider?.SetBackgroundColor (Color.Red);

这是C#代码,但在Java中是一样的。


2
这是代码的Java版本 - int textColorId = getResources().getIdentifier("alertMessage", "id", "android"); TextView textColor = (TextView) alertDialog.findViewById(textColorId); if (textColor != null) { textColor.setTextColor(Color.RED); } - Rishabh Wadhwa

3

2

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

1

在您的 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>

对于 Android 5.0 以下的设备,请将其放置在 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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接