0

我正在尝试SwitchPreference根据其状态更改我的图标。如果SwitchPreference打开,我希望图标设置为@drawable/ic_notifications_active,但如果关闭,我希望图标设置为@drawable/ic_notifications_off

这是我的PreferenceScreenxml 文件中的内容:

<SwitchPreference
    android:icon="@drawable/ic_notifications_active"
    android:key="notifications_switch_preference"
    android:defaultValue="true"
    app:title="Receive Notifications" />

这就是我的设计选项卡中的样子:

SwitchPreference的Android设计选项卡

在我的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切换时,它会将图标的颜色更改为白色,但不是实际的图标。当我再次单击时,它会更改图标,但它仍然是白色的,不再是默认的灰色。现在为错误的状态显示错误的图标。

这是开启和关闭状态的样子:

开启偏好设置 关闭首选项

如何做到这一点,以便当用户单击切换时,它会更改为正确的图标并且不会更改颜色。我也希望它在第一次尝试时起作用,而不是在第二次尝试时。

4

1 回答 1

1

由于下一行,显示了错误的图标:

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
            }
        }
    }

链接到 gif

示例测试

于 2020-08-22T06:21:10.713 回答