社区首页 >问答首页 >如何在更新相同值的密钥时强制SharedPreferenceChangeListener通知

如何在更新相同值的密钥时强制SharedPreferenceChangeListener通知
EN

Stack Overflow用户
提问于 2019-01-11 15:12:31
回答 1查看 29关注 0票数 0

SharedPreferenceChangeListener可以(而且确实做到了!)当db更新为相同的值时跳过通知,例如从truetrueboolean值。在实践中,当值更改为不同的值时,您会收到通知。

如何获得每次SharedPreference键/值更新时的通知?

EN

回答 1

Stack Overflow用户

发布于 2019-01-11 15:12:31

简单而简单的解决方案是,当键/值对存在于SharedPreferences中时,对它进行。记住忽略SharedPreferenceChangeListener中的空通知。当删除值和插入新值时,您将收到通知。

Check out preferenceManager.remove(key) in:

代码语言:javascript
代码运行次数:0
复制
open class MyBasePreferences : KoinComponent {

    val context: Context by inject()
    val preferenceManager: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)

    /**
     * Saves primitive value to shared preferences
     */
    fun SharedPreferences.save(key: String, value: Any?) {
        if (value == null)
            throw RuntimeException("Trying to save null value!")

        if (preferenceManager.contains(key))
            preferenceManager.remove(key)
        preferenceManager.edit {
            when (value) {
                is String -> putString(key, value)
                is Long -> putLong(key, value)
                is Boolean -> putBoolean(key, value)
                is Int -> putInt(key, value)
                is Float -> putFloat(key, value)
                else -> throw RuntimeException("Type not supported in Preferences!")
            }
        }
    }
}

自定义SharedPrefChangeListener

代码语言:javascript
代码运行次数:0
复制
class MySharedPrefChangeListener : SharedPreferences.OnSharedPreferenceChangeListener, KoinComponent {

    /**
     * Called when a shared preference is changed, added, or removed.
     */
    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
        if (sharedPreferences == null)
            return

        if (sharedPreferences.contains(key)) {
            when (key) {
                "YOUR_KEY" -> {
                    // action to perform
                }
            }
        }
    }
}

App类内部:

代码语言:javascript
代码运行次数:0
复制
/**
 * Main application class
 */
class MyApp : Application(), KoinComponent {

    var preferenceManager: SharedPreferences? = null
    var prefChangeListener: MySharedPrefChangeListener? = null

    override fun onCreate() {
        super.onCreate()

        preferenceManager = PreferenceManager.getDefaultSharedPreferences(this)
        prefChangeListener = MySharedPrefChangeListener()
        preferenceManager?.registerOnSharedPreferenceChangeListener(prefChangeListener)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54149218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文