19

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

但似乎没有任何效果。

4

3 回答 3

37

我知道我迟到了。但是,我遇到了完全相同的问题,我刚刚修复了。

我找到了一种仅使用资源文件来修复它的方法。我在这里找到了答案:https ://stackoverflow.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);

        ...
    }
}

这样,当禁用选项时,标题和摘要将变成灰色。

我只是分享这个解决方案,因为我有同样的问题,它可能对某人有帮助

于 2015-09-17T22:11:36.033 回答
3

I figured this out more or less by accident, but if you subclass Preference and override the onBindView(), you can achieve the "grayed out" effect when a preference is disabled:

@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));
    }
}
于 2013-07-22T04:06:15.057 回答
1

如果你看看谷歌是如何为他们的主题做的,你会注意到这一点对于 light (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

二级文本颜色和第三级也是如此,顺便说一句。

于 2020-06-21T09:23:59.753 回答