如何使用自定义主题更改默认文本颜色?
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 继承。 = <style name="AppTheme" parent="AppBaseTheme">
@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您不能使用@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>
【讨论】:
这个解决方案非常干净。问题是RadioButton
、CheckBox
、Switch
、EditText
中的文本...有什么想法吗?
我要回答我自己的问题。您可以将android:textColorPrimaryDisableOnly
用于RadioButton
、CheckBox
、Switch
。您可以使用android:editTextColor
和android: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>
试试这个...
【讨论】:
以上是关于如何使用自定义主题更改默认文本颜色?的主要内容,如果未能解决你的问题,请参考以下文章