【问题标题】:getDefaultSharedPreferences(this) generates null error at runtime?getDefaultSharedPreferences(this) 在运行时生成空错误?
【发布时间】:2021-08-05 05:36:36
【问题描述】:

我正在尝试在我的主要活动中设置一个侦听器以更改“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)
}

就他们自己而言,是否有更优雅的解决方案或者这是最好的方法?

【问题讨论】:

    标签: android kotlin sharedpreferences


    【解决方案1】:

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

    在活动生命周期中将getDefaultSharedPreferences() 调用移至onCreate() 或更高版本。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        相关资源
        最近更新 更多