android - 更新具有相同值的键时如何强制 SharedPreferenceChangeListener 通知
问题描述
SharedPreferenceChangeListener
当 db 使用相同的值更新时,可以(并且确实!)跳过通知,例如boolean
从true
to的值true
。实际上,当值更改为不同的值时,您会收到通知。
如何获得有关每个 SharedPreference 键/值更新的通知?
解决方案
简单、幼稚的解决方案是删除SharedPreferences 中存在的键/值对。请记住忽略. SharedPreferenceChangeListener
当删除值和插入新值时,您会收到通知。
签出preferenceManager.remove(key)
:
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
:
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 类内部:
/**
* 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)
}
}
推荐阅读
- javascript - 防止输入复选框切换
- r - 如何根据抓取结果中的符号将 R 中的一列拆分为两列?
- sql - SQL 批量上传/复制格式文件错误
- vhdl - 使用 GHDL 使用 COE 文件模拟 Xilinx FIR 编译器
- ios - 为集合视图单元格转换 pdf 的第一页时创建黑框的代码。如何解决这个问题?
- azure - Azure Powershell:查找虚拟机的创建者
- python - Geopandas 空间连接失败 - 不支持的格式字符串
- react-native - React Native 是否有相对于字体的大小单位?
- pivot-table - 使用 DAX 计算涉及事实表上日期的度量
- ios - 有没有办法获取从文档目录生成并保存到 ibooks 或电子邮件的 pdf?