Android:使用主题/样式更改禁用文本的颜色?
Posted
技术标签:
【中文标题】Android:使用主题/样式更改禁用文本的颜色?【英文标题】:Android: change color of disabled text using Theme/Style? 【发布时间】:2013-07-20 02:28:38 【问题描述】:我在 color.xml 中定义了以下颜色:
<color name="gold">#d49e43</color>
<color name="gold_disabled">#80d49e43</color>
还有以下主题:
<style name="Theme.Example" parent="@style/Theme.Sherlock">
<item name="android:textColor">@color/gold</item>
</style>
在我的 SettingsActivity 中,我有一个 CheckBoxPreference 和一个依赖于它的 Preference。当 CheckBoxPreference 未选中时,Preference 被禁用,但是,由于我设置的自定义金色文本颜色,它不会像使用默认颜色那样“变灰”。如何在 XML 中更改它?我试过设置:
<item name="android:textColorPrimaryDisableOnly">@color/gold_disabled</item>
<item name="android:textColorPrimaryInverseDisableOnly">@color/gold_disabled</item>
<item name="android:textColorPrimaryNoDisable">@color/gold_disabled</item>
<item name="android:textColorSecondaryNoDisable">@color/gold_disabled</item>
<item name="android:textColorPrimaryInverseNoDisable">@color/gold_disabled</item>
<item name="android:textColorSecondaryInverseNoDisable">@color/gold_disabled</item>
但似乎没有任何效果。
【问题讨论】:
【参考方案1】:我知道我迟到了。但是,我遇到了完全相同的问题,我刚刚解决了。
我找到了一种仅使用资源文件来修复它的方法。我在这里找到了答案:https://***.com/a/17123161/4860513
基本上,你可以在:res/color/下创建一个颜色选择器
注意:如果文件夹不存在,则必须创建文件夹颜色。
对我来说,我做到了:
res\color\primary_text_color_selector.xml(用于标题)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="false" android:color="#80000000"/>
<item android:color="#FF000000"/>
</selector>
res\color\secondary_text_color_selector.xml(摘要)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="false" android:color="#80000000"/>
<item android:color="#C0000000"/>
</selector>
然后,按照我喜欢的风格,我做了:
res\values\styles.xml
<!-- Preference Screen Theme -->
<style name="AppTheme_PreferenceScreenStyle">
<item name="android:textColorPrimary">@color/primary_text_color_selector</item>
<item name="android:textColorSecondary">@color/secondary_text_color_selector</item>
</style>
在 SettingsFragmentActivity.java 中
public class SettingsFragmentActivity extends PreferenceFragment
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
PreferenceScreen preferenceScreen = getPreferenceScreen();
mContext = preferenceScreen.getContext();
mContext.setTheme(R.style.AppTheme_PreferenceScreenStyle);
...
这种方式,当禁用选项时,标题和摘要将灰色。
我只是分享这个解决方案,因为我有同样的问题,它可能对某人有所帮助
【讨论】:
出色的解决方案,包含实施它所需的所有步骤 - 对我帮助很大 这是否适用于更改复选框或单选按钮图标的颜色?如果是这样,styles.xml 文件中的项目名称是什么? 确保“android:textColor”未定义,否则不起作用。 我发现android:textColorPrimary
不适用于标题,但是android:textColor
可以(在styles.xml 中)【参考方案2】:
我或多或少偶然发现了这一点,但是如果您将 Preference 子类化并覆盖 onBindView(),则可以在禁用首选项时实现“灰显”效果:
@Override
protected void onBindView(View view)
// TODO Auto-generated method stub
super.onBindView(view);
TextView title = (TextView)view.findViewById(android.R.id.title);
TextView summary = (TextView)view.findViewById(android.R.id.summary);
if (title.isEnabled())
title.setTextColor(getContext().getResources().getColor(R.color.gold));
else
title.setTextColor(getContext().getResources().getColor(R.color.gold_disabled));
if (summary.isEnabled())
summary.setTextColor(getContext().getResources().getColor(R.color.orange));
else
summary.setTextColor(getContext().getResources().getColor(R.color.orange_disabled));
【讨论】:
【参考方案3】:如果你看看谷歌是如何为他们的主题做的,你会注意到这一点是为了光(Platform.AppCompat.Light):
<item name="android:textColorPrimary">@color/abc_primary_text_material_light</item>
<item name="android:textColorPrimaryInverse">@color/abc_primary_text_material_dark</item>
这适用于深色主题(Platform.AppCompat):
<item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
<item name="android:textColorPrimaryInverse">@color/abc_primary_text_material_light</item>
这些的颜色是这样设置的:
abc_primary_text_material_dark.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/primary_text_disabled_material_dark"/>
<item android:color="@color/primary_text_default_material_dark"/>
</selector>
abc_primary_text_material_light.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/primary_text_disabled_material_dark"/>
<item android:color="@color/primary_text_default_material_dark"/>
</selector>
因此,您应该这样做(在主题文件中创建文件和对它们的引用),处理明暗主题,以及处理文本颜色的状态。
要在应用程序中使用它,您可以使用?android:textColorPrimary
或?android:textColorPrimaryInverse
。
二级文本颜色和第三级也是如此,顺便说一句。
【讨论】:
以上是关于Android:使用主题/样式更改禁用文本的颜色?的主要内容,如果未能解决你的问题,请参考以下文章
AlertDialog 样式 - 如何更改标题、消息等的样式(颜色)
如何在 android tv 的详细概述中更改操作项的文本颜色/样式
在 AppCompat 21 中使用 Light.DarkActionBar 主题更改 ActionBar 标题文本颜色