【问题标题】:SharedPreference Before oncreate for global variableSharedPreference 在创建全局变量之前
【发布时间】:2021-04-20 08:57:53
【问题描述】:

我是初学者,我想保存用户设置,但是使用的设置变量是全局声明的


class MainActivity : AppCompatActivity() {

    private var ASPECTRATIO =if(!getPref("AspectRatio")) AspectRatio.RATIO_16_9  else AspectRatio.RATIO_4_3   //this varible is used all over methods
    
    @SuppressLint("ClickableViewAccessibility", "InflateParams")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

     }
        fun getPref(key:String): Boolean {
            val sharedPrefs=getSharedPreferences("Settings",Context.MODE_PRIVATE)
            return sharedPrefs.getBoolean(key,false)
        }
        fun putPref(key: String,value : Boolean){
            val sharedPrefs=getSharedPreferences("Settings",Context.MODE_PRIVATE)
            with(sharedPrefs.edit()){
                putBoolean(key, value).apply()
            }
        }
        .....       

这会产生空指针异常。我认为在 onCreate() 之前没有上下文,因为在此之前初始化了全局变量。

有没有一种解决方案,我可以使用 sharedPreference 并在 oncreate 之前从 shared prefrenece 分配值。 谢谢。

【问题讨论】:

    标签: android kotlin nullpointerexception sharedpreferences


    【解决方案1】:

    惯用的解决方案是使用lazy 初始化:

    class MainActivity {
        private val aspectRatio by lazy { getPref(...) }
        
        //...
    }
    

    这样,aspectRatio 的初始化将推迟到第一次使用它(应该是在 Context 已经可用时)

    【讨论】:

    • 但我需要的是 var 而不是 val ,我会经常更改该变量。
    • 如果我想用lazy{}访问sharedpreference,它会显示nullpointerexception。
    • 如果要更改,声明为private lateinit var aspectRatio: ...,并在onCreate中初始化。您可以在之后更改它。
    【解决方案2】:

    也许你可以像这样使用 sharedPreferencies:

        private val sharedPreferences: SharedPreferences = context.getSharedPreferences("MyPref", Context.MODE_PRIVATE)
    
    
        sharedPreferences.edit().putString("name_of_param", param).apply()
    
        return sharedPreferences.getString("name_of_param", null)
    

    【讨论】:

    • 此时上下文将为空。
    【解决方案3】:

    嗯,你可以先将它定义为var,并带有一些默认值,然后在第一次使用之前甚至在super.onCreate()之前在onCreate中修改它

    private var aspectRatio = AspectRatio.RATIO_4_3 //default value
    
    override fun onCreate(savedStateInstance: Bundle?){
         aspectRatio = if(!getPref("AspectRatio")) AspectRatio.RATIO_16_9 else AspectRatio.RATIO_4_3 
         super.onCreate(savedStateInstance)
    }
    

    【讨论】:

    • 我试过了但是不能用 var ,idle 让我改成 val 错误。
    • 如果我想用lazy{}访问sharedpreference,它会显示nullpointerexception。
    【解决方案4】:
    lateinit var editor: SharedPreferences.Editor
    lateinit var sharedPreferences: SharedPreferences
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.login_activity)
        sharedPreferences = this.getSharedPreferences(
            "SharedPrefName",
            Context.MODE_PRIVATE
        )
        editor = sharedPreferences.edit()
        if (!sharedPreferences.getString("name", "").toString().isEmpty()) {
            val intent = Intent(this, HomeActivity::class.java)
            startActivity(intent)
        }
    

    【讨论】:

      猜你喜欢
      • 2016-10-25
      • 1970-01-01
      • 2017-11-12
      • 2015-03-24
      • 2013-03-23
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多