图标更改不适用于 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
}
}
}
我正在尝试根据其状态更改 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
}
}
}