【问题标题】:Android: change color of disabled text using Theme/Style?Android:使用主题/样式更改禁用文本的颜色?
【发布时间】: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>

但似乎没有任何效果。

【问题讨论】:

    标签: android colors styles textview themes


    【解决方案1】:

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

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

    这种方式,当禁用选项时,标题和摘要将灰色。

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

    【讨论】:

    • 出色的解决方案,包含实施它所需的所有步骤 - 对我帮助很大
    • 这是否适用于更改复选框或单选按钮图标的颜色?如果是这样,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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        • 2016-11-20
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        相关资源
        最近更新 更多