【问题标题】:Kotlin - Initializing SharedPreferencesKotlin - 初始化 SharedPreferences
【发布时间】:2020-06-24 20:35:44
【问题描述】:

我正在尝试使用 Kotlin 中的 sharedpreferences 加载和保存数据,特别是使用 Android Studio。

我收到此错误消息:

java.lang.NullPointerException:尝试调用虚拟方法 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在空对象引用上

指向我对共享首选项的初始化。

class MainActivity : AppCompatActivity(), SensorEventListener {

   private val dragonstats by lazy {getSharedPreferences("DRAGON_STATS",Context.MODE_PRIVATE)}

如果我这样写,我会得到同样的错误:

val dragonstats = getSharedPreferences("DRAGON_STATS", Context.MODE_PRIVATE)

我在其他答案中看到过这样声明:

SharedPreferences dragonstats

但这在 Kotlin 中无法读取。

共享首选项上的 android.com 文件说要这样声明:

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

但这会给活动带来未解决的参考错误。

如何初始化 SharedPreferences 文件以便在 Kotlin 中存储和检索数据?


编辑: 所以,唯一让它发挥作用的方法就是把 ?无所不包。

我在 oncreate 之外声明它,所以我可以在整个过程中使用它:

var dragonstats: SharedPreferences? = null

在 oncreate 中我设置了它:

dragonstats = PreferenceManager.getDefaultSharedPreferences(this)

然后,当我想调用它的任何部分时,我使用 ?:

exerciselevel = dragonstats?.getInt("exerciselevel", 0)!!

我不明白为什么这行得通,但没有别的。

【问题讨论】:

    标签: android kotlin sharedpreferences


    【解决方案1】:

    我是这样写的。

    // in global
    private lateinit var pref: SharedPreferences
    
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
          pref = getSharedPreferences("mysharedpref", Context.MODE_PRIVATE)
        ...
    }
    
    

    【讨论】:

    • 这对我不起作用。我不断收到:原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'
    • 我刚刚尝试了这个答案,它在 Android Studio 4 中对我有用
    【解决方案2】:

    尝试这样的方法来初始化偏好:

    val pref = PreferenceManager.getDefaultSharedPreferences(context) 
    

    读取数据:

    pref.getString("your_key","default_value")
    

    保存数据:

    pref.edit().putString("key","value").apply()
    

    编辑:

    如果你想让你的变量全局化,你可以这样做:

    lateinit var pref:SharedPreferences
    

    然后在 onCreate() 中:

    pref = PreferenceManager.getDefaultSharedPreferences(context) 
    

    【讨论】:

    • 得到同样的错误:原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'
    • 你在onCreate()方法中调用初始化吗?
    • 我试图让 SharedPreferences 值在所有函数中都可用,所以我试图在 oncreate 函数之外声明它。我有点初学者,我似乎无法弄清楚如何做到这一点。
    【解决方案3】:

    我刚开始学习 Android 和 Kotlin,Jasper Calapini 建议的答案在 Android Studio 4 中适用于我

    private lateinit var pref: SharedPreferences
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            pref = getSharedPreferences("myPref", Context.MODE_PRIVATE)
            var name: String? = pref.getString("my-string", "hello")
    
            val editor = pref.edit()
            editor.putString("my-string", "value is changed")
            editor.apply()
    
            println("name = ${name}")  
     }  
    

    【讨论】:

      【解决方案4】:

      正如错误所说,你得到一个NullPointerException,因为Context 是空的。 您当然可以使用它,但请注意关键字 this 是隐含的:

      private val dragonstats by lazy {getSharedPreferences("DRAGON_STATS",Context.MODE_PRIVATE)}
      //equivalent to
      private val dragonstats by lazy {this.getSharedPreferences("DRAGON_STATS",Context.MODE_PRIVATE)}
      

      [this,] 它是应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序的另一部分(活动和包/应用程序)的信息。 See the full answer on SO

      为了不获得 NullPointerException,只需要遵守一个条件:您必须具有应用程序/活动的上下文。为此,不要忘记在 OnCreate() 方法中调用 this.setContentView(R.layout.main)(同样,关键字 this 不是必需的,可能是隐含的),这将创建您正在寻找的上下文。换句话说,它将“初始化”应用程序上下文this

      如果您在活动之外需要 SharedPreferences,请查看此answer

      我认为private val pref by lazy {} 最适合使用(因为val,而不是var,并且在一行代码中进行了初始化),但请确保在使用pref之前调用this.setContentView(R.layout.main)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-08
        • 2020-12-25
        • 1970-01-01
        • 2022-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多