如何使用自定义主题更改默认文本颜色?

Posted

技术标签:

【中文标题】如何使用自定义主题更改默认文本颜色?【英文标题】:How to change default text color using custom theme? 【发布时间】:2012-03-24 11:43:06 【问题描述】:

我正在尝试的主题应该很容易,但我不知道如何: 我希望我的应用程序中的所有文本默认为白色。 我在 theme.xml 中创建了一个自定义主题:

<style name="Theme" parent="@android:Theme">
</style>

<style name="TextAppearance.Theme" parent="@android:TextAppearance.Theme">
    <item name="android:textColor">#ffffffff</item>
</style>

并为整个应用程序设置它:

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme">

但标签仍然是黑色的。 缺少什么?

PS:如何为不同的文本大小另外定义样式,以应用于每个小部件? 这样的事情对吗?

<style name="Theme.smallText">
    <item name="android:textSize">12dp</item>
</style>

更新

我查看了 Android SDK 中的 themes.xml,它展示了如何为主题设置文本样式:

<item name="textAppearance">@android:style/TextAppearance</item>

在我的情况下,它应该适用于这个定义:

<style name="Theme" parent="@android:Theme">
    <item name="android:textAppearance">@style/MyText</item>
</style>

<style name="MyText" parent="@android:style/TextAppearance">
    <item name="android:textColor">#ffffffff</item>
</style>

但是还是不行。

这里是another post,关于同样的问题。

【问题讨论】:

您的更新显示“仍然无法正常工作”。是抛出任何错误还是文本样式没有生效? 【参考方案1】:

在您的Manifest 中,您需要引用style 的名称,其中包含文本颜色item。现在你只是引用一个空的style。所以在你的 theme.xml 中只做这个style:

<style name="Theme" parent="@android:style/TextAppearance">
    <item name="android:textColor">#ffffffff</item>
</style>

并让你在Manifest中引用相同(android:theme="@style/Theme"

编辑

主题.xml:

<style name="MyTheme" parent="@android:style/TextAppearance">
    <item name="android:textColor">#ffffffff</item>
    <item name="android:textSize">12dp</item>
</style>

清单:

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/MyTheme">

请注意,我将文本颜色和大小组合成相同的style。此外,我将主题的名称更改为 MyTheme,现在在 Manifest 中引用它。我将parent 值更改为@android:style/TextAppearance

【讨论】:

如果我这样做,我会得到异常“资源不是 ColorStateList”。我使用子样式 (?):。这种变化还可以吗? 您说“现在您只是在引用一个空样式。”这是否意味着 android:Theme 是一个空样式?奇怪... 对不起,空的,不是正确的词。你只是没有对android:Theme 做任何事情,所以当你在Manifest 中使用它时,它只是像往常一样应用相同的主题。请参阅我的编辑,了解您的代码应该是什么样子。 还有一个小改动。试试我上面的做法,让我们知道它是如何工作的。 抱歉,这不起作用。我得到“错误膨胀类 android.widget.TextView。原因:资源不是 ColorStateList【参考方案2】:

当您创建应用程序时,将在您的 res/values 文件夹中创建一个名为 styles.xml 的文件。如果更改样式,则可以更改所有布局的背景、文本颜色等。这样您就不必进入每个单独的布局并手动更改它。

styles.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Theme.AppBaseTheme" parent="@android:style/Theme.Light">
    <item name="android:editTextColor">#295055</item> 
    <item name="android:textColorPrimary">#295055</item>
    <item name="android:textColorSecondary">#295055</item>
    <item name="android:textColorTertiary">#295055</item>
    <item name="android:textColorPrimaryInverse">#295055</item>
    <item name="android:textColorSecondaryInverse">#295055</item>
    <item name="android:textColorTertiaryInverse">#295055</item>

     <item name="android:windowBackground">@drawable/custom_background</item>        
</style>

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

parent="@android:style/Theme.Light" 是 Google 的原生颜色。以下是原生样式的参考: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/themes.xml

默认的 Android 风格也称为“主题”。所以你称它为 Theme 可能会混淆程序。

name="Theme.AppBaseTheme" 表示您正在创建一个继承parent="@android:style/Theme.Light" 的所有样式的样式。 这部分你可以忽略,除非你想再次从 AppBaseTheme 继承。 = &lt;style name="AppTheme" parent="AppBaseTheme"&gt;

@drawable/custom_background 是我放在 drawable 文件夹中的自定义图像。这是一张 300x300 的 png 图片。

#295055 是深蓝色。

我的代码更改了背景和文本颜色。对于 Button 文本,请查看 Google 的原生 stlyes(我在上面给你的链接)。

然后在Android Manifest中,记得包含代码:

<application
android:theme="@style/Theme.AppBaseTheme">

【讨论】:

很好的扩展答案,它解释的不仅仅是 koopaking3。但是,您在 Theme.AppBaseTheme 中包含的项目不包括基本的“android:textColor”。我的应用程序中大多数文本视图的颜色是由这个属性决定的,而不是由例如。 android:textColorPrimary. 这会在整个应用程序中全局更改颜色,这样您就不必在每个 TextView 中设置属性。这会更改整个应用的默认设置。 它没有(或者至少对我来说不是),这就是我试图解释的。而且我没有在我的任何文本视图中设置属性。 您可以通过 gc.genechuang@gmail.com 将您的代码发送给我。我去看看 此代码修复了我在首选项屏幕中的问题(更改辅助文本)。我刚刚发现有这个次要项目。谢谢@Gene #295055【参考方案3】:

您不能使用@android:style/TextAppearance 作为整个应用主题的父级;这就是为什么koopaking3's solution 看起来很糟糕的原因。

要使用自定义主题更改应用中各处的默认文本颜色,请尝试以下操作。 至少适用于 Android 4.0+(API 级别 14+)。

res/values/themes.xml:

<resources>    
    <style name="MyAppTheme" parent="android:Theme.Holo.Light">
        <!-- Change default text colour from dark grey to black -->
        <item name="android:textColor">@android:color/black</item>
    </style>
</resources>

清单:

<application
    ...
    android:theme="@style/MyAppTheme">

更新

上面的一个缺点是禁用操作栏溢出菜单项使用默认颜色,而不是灰显。 (当然,如果您不在应用程序的任何地方使用禁用的菜单项,这可能无关紧要。)

据我了解 by asking this question,更好的方法是使用 drawable 定义颜色:

<item name="android:textColor">@drawable/default_text_color</item>

...res/drawable/default_text_color.xml 指定单独的state_enabled="false" 颜色:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="@android:color/darker_gray"/>
    <item android:color="@android:color/black"/>
</selector>

【讨论】:

这个解决方案非常干净。问题是RadioButtonCheckBoxSwitchEditText 中的文本...有什么想法吗? 我要回答我自己的问题。您可以将android:textColorPrimaryDisableOnly 用于RadioButtonCheckBoxSwitch。您可以使用android:editTextColorandroid:textColorHint 来表示EditText。相关问题:How to change default color in all texts in my Android application?【参考方案4】:

检查您的活动布局是否覆盖主题,查找位于layout/*your_activity*.xml 的活动布局并查找包含android:textColor="(some hex code") 类似活动的TextView布局,然后将其删除。然后再次运行您的代码。

【讨论】:

【参考方案5】:
    <style name="Mytext" parent="@android:style/TextAppearance.Medium"> 
    <item name="android:textSize">20sp</item> 
    <item name="android:textColor">@color/white</item> 
    <item name="android:textStyle">bold</item>
    <item name="android:typeface">sans</item>
</style>

试试这个...

【讨论】:

以上是关于如何使用自定义主题更改默认文本颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中通过更改主题来更改文本颜色

如何使用主题和 Theme.AppCompat.DayNight 更改操作栏中的文本颜色

visualstudio命令提示符颜色怎么改

如何在角度材质中定义自定义主题以控制按钮文本的颜色?

如何在wordpress自定义中添加颜色选项

如何更改 WPF 文本框的突出显示文本颜色?