【问题标题】:How to save another value instead of newValue in OnPreferenceChange?如何在 OnPreferenceChange 中保存另一个值而不是 newValue?
【发布时间】:2020-04-18 17:05:30
【问题描述】:

我有一个带有 onPreferenceChangeListener 键“base_url”的首选项。 问题是我想直接在 onPreferenceChange 中更改错误的输入,但它不保存。 例如:输入是 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

问题是,当我尝试在 Activity 中调用首选项时,它会显示没有 https:// 的旧值 这是我在 MainActivity 中的调用:

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

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

因为直接在 onPreferenceChangeListener 中调用 Preference 会使用 https 提供正确的输出。

sharedPref.getString("base_url","")

【问题讨论】:

    标签: android kotlin sharedpreferences android-preferences


    【解决方案1】:

    我认为这里有几个问题:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      相关资源
      最近更新 更多