【问题标题】:How to format value in onPreferenceChangeListener before saving?保存前如何格式化 onPreferenceChangeListener 中的值?
【发布时间】:2021-06-16 17:55:09
【问题描述】:

我在我的PreferenceScreen 字段中有一个EditTextPreference,我必须保存用户必须输入一个有效的 URL,因为该 URL 将用于改造调用,所以我必须正确格式化它。

所以我创建了一个onPreferenceChangeListener,最初我在其中检查 url 插入是否有效,然后我正在格式化它。

问题是一旦用户按下ok,格式化的值不会被保存,根本不会保存任何值。

这是我的听众:

private fun String.formatURL(): String {
    var url = this

    if (!this.startsWith("http")) {
        url = "http://$url"
    }

    if (!url.endsWith("/")) {
        url = "$url/"
    }

    return url
}

editPref?.onPreferenceChangeListener =
    Preference.OnPreferenceChangeListener { preference, newValue ->
        val url = newValue.toString()
        if (Patterns.WEB_URL.matcher(url).matches()) {
            preference.sharedPreferences.edit().putString(preference.key, url.formatURL())
            false
        } else {
            customSnack(requireView(), "URL del server non valido!", true)
            false
        }
    }

【问题讨论】:

    标签: android kotlin sharedpreferences preferenceactivity


    【解决方案1】:

    注意 OnPreferenceChangeListener 返回 true/false 是否可以存储值。即使 URL 匹配模式,您也会返回 false。然后你应该返回true

        if (Patterns.WEB_URL.matcher(url).matches()) {
            preference.sharedPreferences.edit().putString(preference.key, url.formatURL())
            true // proper URL, storing, handled
        } else {
            customSnack(requireView(), "URL del server non valido!", true)
            false
        }
    

    【讨论】:

    • 如果我返回 true,保存的值将是 newValue 而不是格式化的
    • 那是因为preference.sharedPreferences.edit().putString(preference.key, url.formatURL()) 没有以commit()apply() 方法结尾,所以没有再次设置值。返回true 时仅存储newValue。好吧,在这种情况下,您可能应该在两种情况下都返回 false,但仍然需要 commit()/apply()url.formatURL() 存储在首选项中
    • 刚刚尝试过,即使以 apply() 结尾,如果我返回 true,它正在设置 newValue,此时我认为问题是我错过了 apply(),即使我返回 false 并设置,也只是尝试过添加错过的apply() 它不起作用
    • 继续返回false,但也返回commit/apply。还在此方法中添加一些Log.i() 并记录您的数据。调用commit/apply 可能会导致再次调用OnPreferenceChangeListener
    • 是的,正确的方法是设置false 作为回报,但问题是通过将摘要设置为useSimpleSummaryProvider 不会更新
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2012-01-21
    • 2014-06-24
    • 2021-04-19
    • 2017-01-03
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多