偏好更改侦听器但在内部状态更改后 android

Preference change listener but AFTER the internal state has changed android

我有一个 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 在内部状态改变之前被调用 ,这意味着我不读取新值,而是读取旧值。

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

OnPreferenceChangeInternalListener.onPreferenceChange 当此首选项更改时调用,但此回调仅供内部使用。

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

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

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

谢谢,见多识广!我会按照你建议的方式去做。看起来不错