问题描述
我正尝试根据其状态更改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
开关时,它将图标的颜色更改为白色,而不是实际的图标。当我再次单击时,它会更改图标,但仍然是白色,不再是默认的灰色。错误状态的图标现在显示出来了。
这是打开和关闭状态的样子:
我如何做到这一点,以便当用户单击切换开关时,它会更改为正确的图标,并且不会更改颜色。我也希望它能在第一次尝试中起作用,而不是在第二次尝试中。
解决方法
由于下一行显示错误的图标:
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
}
}
}