【问题标题】:AlertDialog styling - how to change style (color) of title, message, etcAlertDialog 样式 - 如何更改标题、消息等的样式(颜色)
【发布时间】: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>

所以这些都不起作用。谁能告诉我我做错了什么,我该怎么做:

  1. 更改消息的文本颜色(内容文本)
  2. 更改标题文本颜色
  3. 删除 面板背景

注意:我需要向上支持 API 8 (2.2)。另外,我在这里和谷歌群组中查看了大部分相关问题,但无法弄清楚,虽然我感觉它就在我的鼻子底下!

编辑:添加截图:

【问题讨论】:

  • 你能提供一张它目前的外观截图吗?
  • @Ahmad:已添加屏幕截图
  • 我想知道你是如何改变这些背景颜色的。使用完全相同的代码,我无法针对 API 级别 9 复制彩色 AlertDialog。您是否以某种特殊方式应用了主题或样式?您的目标和最低 sdk 级别设置为多少?
  • 奇怪...不知何故我让它工作了,我不知道怎么做。非常感谢这篇文章,我为此挠了好几个小时。对于任何搜索的人来说,这个问题/答案是在 Android API 级别自定义 AlertDialogs 的权威方法
  • ...但由于某种原因,如果我在任何运行 Android >= 3.0 的设备上运行此代码,对话框颜色不会改变。因此,对于 >2.3.3 和

标签: android android-alertdialog android-theme android-styles


【解决方案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 在使用应用程序兼容性警报对话框时对我不起作用:stackoverflow.com/questions/35179537/…
  • 使用 Material 主题是正确的,您不能使用 android:textAppearanceMedium 更改内容样式,请参阅此线程以获取解决方法stackoverflow.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://stackoverflow.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>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 2021-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多