如何在首选项更改中保存另一个值而不是新值?



我有一个带有 onPreferenceChangeListener 键 "base_url" 的首选项。 问题是我想直接在首选项更改中更改错误的输入,但它没有保存。 例如:输入 google.at 它应该向 URL 添加 https://。

class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings_pref, rootKey)
val editURLPreference: EditTextPreference? = findPreference("base_url")
val preferenceURLListener: Preference.OnPreferenceChangeListener =
object : Preference.OnPreferenceChangeListener {
override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean {
var newURL = newValue as String
when {
newURL.isEmpty() -> {
}
newURL.startsWith("https://") -> {
}
newURL.startsWith("http://") -> newURL =
newURL.replace("http://", "https://")
else -> newURL = "https://".plus(newValue)
}
if (Patterns.WEB_URL.matcher(newURL).matches()) {
Log.w("Test","passt $newURL")
val sharedPref = PreferenceManager.getDefaultSharedPreferences(requireContext().applicationContext)
sharedPref.edit().putString("base_url",newURL).apply()
Log.w("Test",sharedPref.getString("base_url","")) //This works!
removeFiles()
return true
}
Toast.makeText(context, "Ungültige Eingabe", Toast.LENGTH_LONG).show()
return false
}
}
editURLPreference?.onPreferenceChangeListener = preferenceURLListener

问题是,当我尝试在活动中调用首选项时,它会显示旧值而不显示 https://这是我在主活动中的电话:

override fun onResume() {
super.onResume()
Log.w("baseURL",PreferenceManager.getDefaultSharedPreferences(applicationContext).getString("base_url",""))  
}

我认为问题是新值没有正确保存,我知道 true 会接受 newValue,也许它会覆盖正确的值。(我已经尝试过上下文和应用程序上下文。

因为直接在 onPreferenceChangeListener 中调用 Ppreferences,会使用 https 给出正确的输出。

sharedPref.getString("base_url","")

我认为这里有几个问题:

  1. 当你返回true时,首选项(newValue(中的当前值将被保存到SharedPreferences。这将覆盖您手动保存的值。
  2. 仅写入共享首选项是不够的,这不会通知首选项更改,因此它不会更新以显示新值。

因此,交换truefalse,因此当您想要"拦截"更改时,返回 false,如果保持值不变,则返回 true。然后,不要手动更改共享首选项,而是调用preference.setText(newURL)。这将更新共享的首选项,并通知首选项该值已更改,因此它将在屏幕上更新。

最新更新