如何设置PreferenceFragmentCompat accentColor?

时间:2015-11-24 18:47:07

标签: android android-fragments android-theme android-attributes android-preference-v14

我想覆盖v14 PreferenceFragmentCompat使用的accentColor。

我在我的Android应用程序的外框上使用了粉红色的强调色。这会在许多情况下产生问题,因为它会导致标准控件使用非常接近红色的强调色,以免影响干扰。尽管如此,我喜欢在框架上使用粉红色FAB和按钮控件的效果。

对于儿童活动,我使用标准的蓝绿色调颜色。但是,我在主活动的抽屉中有一个PreferenceFragment compat,我无法弄清楚如何覆盖主要活动的强调色。

我尝试的事情(没有一个工作):

在接收PreferenceFragmentCompat的片段的框架上设置主题(不起作用):

<FrameLayout android:id="@+id/preferenceFragmentFrame" 
    android:layout_width="match_parent" android:layout_height="0dp"
    android:layout_weight="1"
    android:theme="@style/AppTheme.TealAccentColor"
    />

AppTheme.TealAccentColor样式提供明确的蓝绿色acccentColor。

在首选项主题中设置accentColor(不起作用):

  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ...
     <item name="preferenceTheme">@style/MyPreferenceThemeOverlay</item>
    </style>
    <style name=MyPreferenceThemeOverlay parent="PreferenceThemeOverlay.v14.Material>
         <item name="colorAccent">@color/colorAccentTeal</item>
    </style>

为偏好-v14的PreferenceThemeOverlay添加强调色(不起作用):

  <!-- use the library's theme-->
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ...
     <item name="preferenceTheme">PreferenceThemeOverlay.v14.Material</item>
   </style>
   <!-- but add an accentColor item to the library's theme -->
   <style name="PreferenceThemeOverlay.v14">
        <item name="colorAccent">@color/colorAccentTeal</item>
   </style>

无论我做什么,PreferenceFragmentCompat似乎都会从Activity的主题中采用粉红色的强调色。

我确定它与Activity的主题和Fragment主题之间的脱节有关。但是片段没有xml元素,因为PreferenceFragmentCompat提供了自己的布局。

也许有一种方法可以通过在扩展PreferenceFragmentCompat的类中使用覆盖来以编程方式进行,但如果有,我无法想象它会是什么。我能想到的大多数攻击点都可以访问内部创建的布局,或者在创建后可以访问布局,这太晚了。

图片可能会有所帮助:

enter image description here

1 个答案:

答案 0 :(得分:1)

您是否尝试覆盖android:colorAccent而不是colorAccent

使用您描述为“在首选项主题中设置accentColor”的方法,只需更改属性名称即可。

首选项支持库根本不考虑appcompat,因此

  1. 忘记appcompat属性
  2. 我认为
  3. color*属性仅适用于API 21

如果您想要一致的行为,则可以使用my library Android Support Preference,其目的是连接首选项和appcompat支持库。

然后,您使用colorAccent(无前缀)的原始样式将按预期工作。