onSharedPreferenceChanged not proc, Kotlin/Android



我设置了我的设置活动<PreferenceScreen祝辞用于选择应用程序设置。我想做的是让我的改变立即生效,而不是重新启动应用。当然,我想使用OnSharedPreferenceChangeListener,但如果我试图把登录onsharedpreferencechange,它永远不会处理更改的选择。我的计划是在首选项更改时重新创建(),因此我的首选项应用函数将在onCreate()上与该重新创建()一起进行。问题是,如前所述,onsharedpreferencechange永远不会处理。>

我尝试注册侦听器,但没有帮助。

有人能帮我吗?

class SettingsActivity : AppCompatActivity(),
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback,
SharedPreferences.OnSharedPreferenceChangeListener {

val Tag = "My Activity:"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val prefMen = SharedPreferencesManager(this)
prefMen.loadTheme()
setContentView(R.layout.activity_settings)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.content_preference, MainPreference()).commit()
} else {
title = savedInstanceState.getCharSequence(TAG_TITLE)
}
supportFragmentManager.addOnBackStackChangedListener {
if (supportFragmentManager.backStackEntryCount == 0) {
setTitle("Settings")
}
}
setUpToolbar()
}
override fun onStart() {
super.onStart()
getPreferences(MODE_PRIVATE).unregisterOnSharedPreferenceChangeListener(this)
}
override fun onDestroy() {
super.onDestroy()
getPreferences(MODE_PRIVATE).unregisterOnSharedPreferenceChangeListener(this)
}
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
outState.putCharSequence(TAG_TITLE, title)
}
override fun onSupportNavigateUp(): Boolean {
if (supportFragmentManager.popBackStackImmediate()) {
return true
}
return super.onSupportNavigateUp()
}
private fun setUpToolbar() {
supportActionBar?.setTitle("Settings")
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
}
class MainPreference : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
}
}
override fun onPreferenceStartFragment(
caller: PreferenceFragmentCompat?,
pref: Preference?
): Boolean {
val args = pref?.extras
val fragment = pref?.fragment?.let {
supportFragmentManager.fragmentFactory.instantiate(
classLoader,
it
).apply {
arguments = args
setTargetFragment(caller, 0)
}
}
fragment?.let {
supportFragmentManager.beginTransaction().replace(R.id.content_preference, it)
.addToBackStack(null).commit()
}
title = pref?.title
return true
}
companion object {
private val TAG_TITLE = "PREFERENCE_ACTIVITY"
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
recreate()
}

}

我看到两个错误。首先,你从来没有注意到你的听众。您在onStart()中呼叫unregisterOnSharedPreferenceChangeListener(),而不是registerOnSharedPreferenceChangeListener()

其次,您没有监听与Fragment使用的设置相同的SharedPreferences。PreferenceFragmentCompat默认使用整个应用程序的默认共享首选项。但是,您正在收听与Activity.getPreferences()检索的首选项,这不是默认的首选项,而是以活动命名的SharedPreferences实例。

所以你应该切换到使用默认的共享首选项,因为Activity的私有共享首选项将不那么容易在其他Activity中获得引用。

我也会在onCreate()而不是onStart()中注册,所以你不会多次注册。我不知道这是否真的很重要,但是文档并没有指定当您重复注册同一个侦听器时会发生什么。也许它会反复触发回调,这可能会浪费你以后寻找bug的时间。

override fun onCreate() {
// ...
PreferenceManager.getDefaultSharedPreferences(this)
.registerOnSharedPreferenceChangeListener(this)
}
override fun onDestroy() {
super.onDestroy()
PreferenceManager.getDefaultSharedPreferences(this)
.unregisterOnSharedPreferenceChangeListener(this)
}

可以指定PreferenceFragmentCompat将使用的SharedPreferences,但是对于您希望从整个应用程序访问的设置,默认首选项是最容易使用的。

最新更新