我试图根据SwitchPreference的状态更改它的图标。如果SwitchPreference是打开的,我希望图标设置为@drawable/ic_notifications_active,但如果是关闭的,则希望图标设置为@drawable/ic_notifications_off。
这就是我的PreferenceScreen xml文件中的内容:
<SwitchPreference
android:icon="@drawable/ic_notifications_active"
android:key="notifications_switch_preference"
android:defaultValue="true"
app:title="Receive Notifications" />这就是我的设计选项卡上的样子:

在我的SettingsActivity中,我有一组代码来检测对SwitchPreference的更改。
notificationsPreference?.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { preference, newValue ->
val switched: Boolean = (preference as SwitchPreference)
.isChecked
if (switched) {
if (notificationsPreference != null) {
notificationsPreference.icon = resources.getDrawable(R.drawable.ic_notifications_active)
}
} else {
if (notificationsPreference != null) {
notificationsPreference.icon = resources.getDrawable(R.drawable.ic_notifications_off)
}
}
true
}现在的问题是,当我第一次运行我的应用程序并点击SwitchPreference按钮时,它会将图标的颜色更改为白色,而不是实际的图标。当我再次单击时,它会更改图标,但它仍然是白色的,不再是默认的灰色。错误的图标现在显示在错误的州。
这就是on和off状态的样子:


我如何使它,使当用户点击按钮,它改变到正确的图标,而不改变颜色。我也希望它能在第一次尝试中发挥作用,而不是在第二次尝试。
发布于 2020-08-22 06:21:10
显示错误的图标是因为下一行:
val switched: Boolean = (preference as SwitchPreference).isChecked在回调中获得的preference对象具有旧值,而newValue存储实际的新值。您必须使用newValue对象来验证开关是否已启用或禁用。
下面是一个完整片段的示例,该片段按预期切换图标:
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
val switchPreference: SwitchPreferenceCompat = findPreference("sync")!!
switchPreference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, newValue ->
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
switchPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_sync_24)
} else {
switchPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_sync_disabled_24)
}
true
}
}
}

https://stackoverflow.com/questions/63532697
复制相似问题