在点击侦听器的 SharedPreferences 中获取新的偏好值

Get new value of preference within SharedPreferences on click listener

我有一个 SwitchPreferenceCompat,密钥为 legacy_storage。当在 SettingsFragment 中禁用或启用此首选项时,我想 运行 一些代码,但是 运行 的代码取决于首选项的新状态。我试过使用

findPreference<SwitchPreferenceCompat>("legacy_storage")?.setOnPreferenceChangeListener { preference, newValue ->

    if (newValue) { // if enabled
       // do some stuff... 
    } else { // if disabled
       // do other stuff...

但它说 Type mismatch: inferred type is Unit but Boolean was expected。我无法更改 lambda 定义以指定布尔值,因为它表示 Type mismatch: inferred type is (Preference!, java.lang.Boolean) -> kotlin.Boolean but ((Preference!, Any!) -> kotlin.Boolean)! was expected.

我也试过 .to(Boolean),但它说 Type mismatch: inferred type is Pair<Boolean, ???> but Boolean was expected

侦听器 lambda 必须 return 一个布尔值,指示它是否处理了更改。通常你只想 return true 除非你正在做一些复杂的事情,多个听众有相同的偏好。 return 来自 lambda 的东西,把它放在 lambda 的最后一行。这就是为什么您的错误消息谈论的是 Unit——您的 if/else 表达式正在计算一个 Unit 并且是 lambda 的最后一个表达式。

newValue 是一个 Any,您必须将其转换为 Boolean 或者测试是否与 true 相等。这是因为 OnPreferenceChangeListener 接口没有使用泛型。

findPreference<SwitchPreferenceCompat>("legacy_storage")?.setOnPreferenceChangeListener { preference, newValue ->
    if (newValue == true) {

    } else {

    }
    true
}