getDefaultSharedPreferences(this) 在运行时生成空错误?

getDefaultSharedPreferences(this) generates null error at runtime?

我正在尝试在我的主 activity 中设置一个侦听器以更改“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:尝试在 null 上调用虚拟方法 'java.lang.String android.content.Context.getPackageName()'对象引用

我不明白为什么会这样,这是系统共享首选项,怎么可能为空?谁能澄清我哪里出错了?


谢谢你的帮助,我设法让它工作了,但我只是想检查一下它是否以“正确”的方式工作,我添加了

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

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

您过早地尝试将 activity 用作 Context。 activity 尚未在实例初始化阶段设置为上下文。

在 activity 生命周期中将 getDefaultSharedPreferences() 调用移至 onCreate() 或更晚的时间。

您应该在 onCreate() 中初始化 SharedPreferences,其中 context 已经存在。

preferences = getDefaultSharedPreferences(this)应该移到那里。