Как заставить уведомление SharedPreferenceChangeListener при обновлении ключа с тем же значением - PullRequest
0 голосов
/ 11 января 2019

SharedPreferenceChangeListener может (и делает!) Пропускать уведомления, когда дБ обновляется с тем же значением, например boolean значение от true до true. На практике вы получаете уведомление, когда значение меняется на другое значение.

Как получить уведомление о каждом обновлении ключа / значения SharedPreference?

1 Ответ

0 голосов
/ 11 января 2019

Простое, наивное решение состоит в том, чтобы удалить пару ключ / значение, если она существует в 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!")
            }
        }
    }
}

custom 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
                }
            }
        }
    }
}

внутри класса приложения:

/**
 * 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...