簡體   English   中英

圖標更改不適用於 SwitchPreference

[英]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" />

這就是我的設計選項卡中的樣子:

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切換時,它會將圖標的顏色更改為白色,而不是實際的圖標。 當我再次單擊時,它會更改圖標,但它仍然是白色的,不再是默認的灰色。 現在為錯誤的狀態顯示錯誤的圖標。

這是開啟和關閉狀態的樣子:

開啟偏好設置 關閉首選項

如何做到這一點,以便當用戶單擊切換時,它會更改為正確的圖標並且不會更改顏色。 我也希望它在第一次嘗試時起作用,而不是在第二次嘗試時。

由於下一行,顯示了錯誤的圖標:

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

鏈接到 gif

示例測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM