首页 > 解决方案 > getDefaultSharedPreferences(this) 在运行时生成空错误?

问题描述

我正在尝试在我的主要活动中设置一个侦听器以更改“force_dark”设置

val preferences = getDefaultSharedPreferences(this)

var listener: SharedPreferences.OnSharedPreferenceChangeListener =
    SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
        if (key == "force_dark") {
            Toast.makeText(this,"config changed",Toast.LENGTH_SHORT).show()
        }
    }


override fun onResume() {
    super.onResume()
    preferences.registerOnSharedPreferenceChangeListener(listener)
}

override fun onPause() {
    super.onPause()
    preferences.unregisterOnSharedPreferenceChangeListener(listener)
}

我的测试代码在上面,但是虽然它可以编译,但它在“val preferences = getDefaultSharedPreferences(this)”上崩溃,并出现错误“java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName ()' 在空对象引用上"

我不明白为什么会发生这种情况,这是系统共享首选项,那么它怎么可能是 null ?谁能澄清我哪里出错了?


感谢您的帮助,我设法让它工作,但只是想检查它是否以“正确”的方式工作,我补充说

lateinit var preferences : SharedPreferences
lateinit var listener : SharedPreferences.OnSharedPreferenceChangeListener

一开始,然后

    preferences = getDefaultSharedPreferences(this)

    listener =
        SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
            if (key == "force_dark") {
                Toast.makeText(this,"config changed",Toast.LENGTH_SHORT).show()
            }
        }

在 onCreate 按照建议然后

override fun onResume() {
    super.onResume()
    preferences.registerOnSharedPreferenceChangeListener(listener)
}

override fun onPause() {
    super.onPause()
    preferences.unregisterOnSharedPreferenceChangeListener(listener)
}

就其本身而言,是否有更优雅的解决方案或者这是最好的方法?

标签: androidkotlinsharedpreferences

解决方案


您试图Context过早地使用您的活动。在实例初始化阶段,该活动尚未设置为上下文。

getDefaultSharedPreferences()调用移至onCreate()Activity 生命周期中或更晚。


推荐阅读