在点击侦听器的 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
}
我有一个 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
}