![](/img/trans.png)
[英]How to change icon of SwitchPreference when it changes state from off to on?
[英]Icon Change Not Working for SwitchPreference
我正在嘗試根據其 state 更改我的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
object具有舊值,而newValue
存儲實際的新值。 您必須使用newValue
object 來驗證開關是啟用還是禁用。
這是一個按預期切換圖標的完整片段示例:
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
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.