图标更改不适用于 SwitchPreference

Icon Change Not Working for SwitchPreference

我正在尝试根据其状态更改 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
            }
        }
    }

Link to the gif