androiddictionarykotlinoncreateonsaveinstancestate

How to pass data from onCreate() to onSaveInstanceState()?


I have an onCreate() function and an onSaveInstanceState() function in my Main Activity. I have declared a Map in my onCreate() and I want to access the keys of that Map in my onSaveInstanceState() function, so as to save them to the outState bundle.

class MainActivity: AppCombatActivity(){

     override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        //Want to access the iconMap here, but it is outside of the Map's scope. How do I access it?
    }

     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val iconMap = mapOf("contactlessIcon" to getDrawable(R.drawable.ic_contactless_24px), "fingerprintIcon" to getDrawable(R.drawable.ic_fingerprint_black_48dp), "codeIcon" to getDrawable(R.drawable.ic_code_24px))
    }
}

I'm fairly new to Android programming, so this might be an easy fix. I want to access the iconMap in the onSaveInstanceState() but it is outside iconMap's scope. I cannot make iconMap a global variable, for this crashes my app.


Solution

  • As @ianhanniballake commented - you shouldn't be saving Drawables that are always the same. In this case it's especially unnecessary since you're onCreate will be called again whenever the activity is restored.

    But, to answer your question, you can do it like this :

    class MainActivity: AppCombatActivity(){
          // define it here, so it's a member of the class
          lateinit val iconMap: Map<String, Drawable>
    
          override fun onSaveInstanceState(outState: Bundle) {
            super.onSaveInstanceState(outState)
            //now you can use it here
          }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
     
            //set its value
            iconMap = mapOf("contactlessIcon" to getDrawable(R.drawable.ic_contactless_24px), "fingerprintIcon" to getDrawable(R.drawable.ic_fingerprint_black_48dp), "codeIcon" to getDrawable(R.drawable.ic_code_24px))
         }
    }