我为所有偏好设置了平面图标,我想全局更改该图标的颜色。
当我尝试以下代码时,它甚至会更改工具栏中的后退按钮颜色。
我只希望全局更改“首选项”图标色调。提前谢谢。
<?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>
答案 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"
}
}
}
}