如何在全局Android中更改首选项图标颜色

时间:2017-03-16 03:53:42

标签: android android-preferences

我为所有偏好设置了平面图标,我想全局更改该图标的颜色。

当我尝试以下代码时,它甚至会更改工具栏中的后退按钮颜色。

我只希望全局更改“首选项”图标色调。提前谢谢。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <SwitchPreference
        android:id="@+id/pref_toggle_alarm"
        android:icon="@drawable/ic_pref_notifications"
        android:key="key_toggle_alarm"
        android:summaryOff="Alarm OFF"
        android:summaryOn="Alarm ON"
        android:title="Alarm" />


    <web.prefs.TimePrefs
        android:id="@+id/pref_select_time"
        android:icon="@drawable/ic_pref_time"
        android:key="key_time"
        android:summary="Set some time"
        android:title="Select Time" />

    <MultiSelectListPreference
        android:id="@+id/pref_select_week"
        android:defaultValue="@array/week_array_values"
        android:entries="@array/array_week_selection"
        android:entryValues="@array/week_array_values"
        android:icon="@drawable/ic_pref_time"
        android:key="key_week"
        android:title="Select Days" />

    <ListPreference
        android:id="@+id/pref_track"
        android:defaultValue="0"
        android:entries="@array/tracks_arrays"
        android:entryValues="@array/tracks_arrays_values"
        android:icon="@drawable/ic_music_note"
        android:key="key_track"
        android:summary="%s"
        android:title="Select Track" />

</PreferenceScreen>

style.xml

<style name="PreferencesTheme" parent="@style/AppTheme.NoActionBar">
    <item name="android:textColorPrimary">@color/primary_text</item>
    <item name="android:textColorSecondary">@color/secondary_text</item>
    <item name="android:colorAccent">@color/accent</item>
    <item name="android:tint">@color/accent</item>
</style>

4 个答案:

答案 0 :(得分:3)

不幸的是,没有简单的方法来设置偏好图标。我的解决方案是,如果使用矢量图标,则可以将属性集成到每个图像的XML中。

在values / attrs.xml中:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="iconPreferenceColor" format="reference|color" />
</resources>

在每个图标中添加 android:fillColor =“?attr / iconPreferenceColor”,示例:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="?attr/iconPreferenceColor"
        android:pathData="M13,2.05v3.03c3.39,0.49 6,3.39 6,6.92 0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53c0.56,-1.24 0.88,-2.62 0.88,-4.07 0,-5.18 -3.95,-9.45 -9,-9.95zM12,19c-3.87,0 -7,-3.13 -7,-7 0,-3.53 2.61,-6.43 6,-6.92V2.05c-5.06,0.5 -9,4.76 -9,9.95 0,5.52 4.47,10 9.99,10 3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z"/>
</vector>

和风格:

<item name="iconPreferenceColor">@color/green</item>

我希望它有用

答案 1 :(得分:0)

您必须以编程方式更改首选项图标的颜色,无法通过主题或XML属性来完成。您可以在PreferenceFragment中添加以下内容:

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.preferences);

    int colorAttr = android.R.attr.textColorSecondary;

    TypedArray ta = context.getTheme().obtainStyledAttributes(new int[]{colorAttr});
    int iconColor = ta.getColor(0, 0);
    ta.recycle();
    tintIcons(getPreferenceScreen(), iconColor);
}

private static void tintIcons(Preference preference, int color) {
    if (preference instanceof PreferenceGroup) {
        PreferenceGroup group = ((PreferenceGroup) preference);
        for (int i = 0; i < group.getPreferenceCount(); i++) {
            tintIcons(group.getPreference(i), color);
        }
    } else {
        Drawable icon = preference.getIcon();
        if (icon != null) {
            icon.setColorFilter(color, PorterDuff.Mode.SRC_IN);
        }
    }
}

或者,我认为this library也可以帮助您为图标着色。它还可以解决AppCompat首选项的其他问题。

答案 2 :(得分:0)

老问题,但我的回答仍然对某人有价值。 上面的答案都没有对我有用,因为我不想改变整个主题,而只想改变图标颜色。 如果您更改参考样式中的色调颜色并将其放入您的主题中,它会像上面的回答中所说的那样变得有问题。 如果您只想更改图标颜色而什么都不更改,我强烈建议您在白天和黑夜场景中使用不同的可绘制资源。 就我而言,我有两个矢量可绘制对象,一个用于白天主题,一个用于夜间主题,它们工作得很好。

答案 3 :(得分:0)

此解决方案不会全局更改图标色调,也不会导致工具栏中的色调问题。在 PreferenceFragmentCompat 的 onViewCreated() 中调用它。

val rv = view.findViewById<RecyclerView>(androidx.preference.R.id.recycler_view)
rv?.viewTreeObserver?.addOnDrawListener {
    rv.children.forEach { pref ->
        val icon = pref.findViewById<View>(android.R.id.icon) as? PreferenceImageView
        icon?.let {
            if (it.tag != "painted") {
                it.setColorFilter(
                    ContextCompat.getColor(requireContext(), R.color.iconColor),
                    PorterDuff.Mode.SRC_IN
                )
                it.tag = "painted"
            }
        }
    }
}