首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图标更改不适用于SwitchPreference

图标更改不适用于SwitchPreference
EN

Stack Overflow用户
提问于 2020-08-22 04:53:54
回答 1查看 219关注 0票数 0

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

这就是我的PreferenceScreen xml文件中的内容:

代码语言:javascript
复制
<SwitchPreference
    android:icon="@drawable/ic_notifications_active"
    android:key="notifications_switch_preference"
    android:defaultValue="true"
    app:title="Receive Notifications" />

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

在我的SettingsActivity中,我有一组代码来检测对SwitchPreference的更改。

代码语言:javascript
复制
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状态的样子:

我如何使它,使当用户点击按钮,它改变到正确的图标,而不改变颜色。我也希望它能在第一次尝试中发挥作用,而不是在第二次尝试。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 06:21:10

显示错误的图标是因为下一行:

代码语言:javascript
复制
val switched: Boolean = (preference as SwitchPreference).isChecked

在回调中获得的preference对象具有旧值,而newValue存储实际的新值。您必须使用newValue对象来验证开关是否已启用或禁用。

下面是一个完整片段的示例,该片段按预期切换图标:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63532697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档