【问题标题】:Preference change listener but AFTER the internal state has changed android偏好更改侦听器,但在内部状态更改之后 android
【发布时间】:2021-07-31 00:15:59
【问题描述】:

我有一个 SettingsFragment,它扩展了 PreferenceFragmentCompat 和 preference.xml

class SettingsFragment : PreferenceFragmentCompat() {

   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = super.onCreateView(inflater, container, savedInstanceState)

        preferenceManager.findPreference<Preference>(USER_CLOUD_PROXY)?.let {
            it.setOnPreferenceChangeListener { _, _ ->
                // mainViewModel.resetConnection()
                true
            }
        }

        return view
    }

}

和xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="User settings">
        <SwitchPreference
            android:defaultValue="true"
            android:enabled="true"
            android:key="user_cloud_proxy"
            android:title="Use cloud proxy" />
    </PreferenceCategory>

</PreferenceScreen>

切换按钮指示我的应用程序必须使用哪个 URL 连接到 webSocket 服务器。因此,当用户更改开关状态时,我想通过函数重置连接。稍后在函数中,我读取了 sharedPreference 值以选择 URL。 然而,it.setOnPreferenceChangeListener 被调用在内部状态改变之前,这意味着我读的不是newValue,而是旧的。

是否有在内部值更改后调用的回调?

【问题讨论】:

  • 那不回答问题...
  • 我没有说它的答案我只是想确认你使用这个只是正确的?
  • 因为根据文档你应该得到 newValue
  • 我可以在回调中获取 newValue,但我想在之后从 sharedPreferences 中读取它,而不是通过将其作为参数传递。但是,我没有找到任何解决方案,所以我像参数一样传递它:P

标签: android kotlin sharedpreferences preferencefragmentcompat


【解决方案1】:

OnPreferenceChangeInternalListener.onPreferenceChange,当这个首选项改变时被调用,但这个回调仅供内部使用。

所以是的,在内部值更改后没有其他回调被调用。 OnPreferenceChangeListener.onPreferenceChange 是您唯一可以使用的。

您可以做的一件事,如果您不想直接从回调中调用该函数并从中获取 newValue,那么您可以手动将新值保存在 SharedPref 中,然后调用可以使用您的逻辑的函数从 sharedpref 读取值并继续。

【讨论】:

    【解决方案2】:

    添加到 dinkar_kumar 的答案,您可以尝试实现 OnSharedPreferenceChangeListener,我认为您可以使用 onSharedPreferenceChanged 进一步使用您的逻辑。

    【讨论】:

    • 根据 onSharedPreferenceChanged 的 java 文档 在更改、添加或删除共享首选项时调用。即使将首选项设置为其现有值,也可能会调用它。
    【解决方案3】:

    谢谢你,消息灵通!我会按照你建议的方式来做。看起来不错

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多