📜  如何使用捆绑包恢复 Android 中更改的配置数据?

📅  最后修改于: 2022-05-13 01:55:02.276000             🧑  作者: Mango

如何使用捆绑包恢复 Android 中更改的配置数据?

在 Android 中,如果应用程序的配置发生变化,例如当 android 屏幕旋转时,那么一些数据会丢失并重置。尤其是来自变量的数据。所以这个问题可以通过重写onSaveInstanaceState()onRestoreInstanceState() 函数来解决。所以在本文中,通过流程图详细讨论了如何解决此问题,以了解何时调用上述这些函数。请注意,我们将使用Kotlin语言来实现这个项目。

下面是一个流程图,表示如何在 UI 中调用方法以及恢复和更新数据:

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!

使用捆绑包恢复 Android 中更改的配置数据

分步实施

第 1 步:创建一个空的活动项目

  • 使用 Android Studio 创建一个新的空活动 Android Studio 项目。参考安卓 | How to Create/Start a New Project in Android Studio?,了解如何创建一个空的Activity Android Studio 项目。

步骤 2:使用 activity_main.xml 文件

  • 应用程序的主要布局包含 EditText、一个 TextView 和两个 Button,它们增加和减少 TextView 的值。
  • 要实现 UI,请调用activity_main.xml文件中的以下代码。
XML


  
    
  
    


Kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
  
class MainActivity : AppCompatActivity() {
  
    // instances of all the UI elements
    lateinit var editText: EditText
    lateinit var counterText: TextView
    lateinit var incrementB: Button
    lateinit var decrementB: Button
  
    // counter to increment or 
      // decrement the counter text
    var countInt: Int = 0
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // register all the UI elements with 
          // their appropriate IDs
        editText = findViewById(R.id.editText)
        incrementB = findViewById(R.id.incrementB)
        decrementB = findViewById(R.id.decrementB)
        counterText = findViewById(R.id.counterText)
  
        // handle the increment button
        incrementB.setOnClickListener {
            if (countInt >= 0) {
                countInt++
                counterText.text = countInt.toString()
            }
        }
  
        // handle the decrement button
        decrementB.setOnClickListener {
            if (countInt > 0) {
                countInt--
                counterText.text = countInt.toString()
            }
        }
    }
  
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
  
        // put the unique key value with the data
          // to be restored after configuration changes
        outState.putInt("counterData", countInt)
    }
  
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
  
        // get the stored data from the bundle using the unique key
        countInt = savedInstanceState.getInt("counterData")
  
        // update the UI
        counterText.text = countInt.toString()
    }
}


输出:

步骤 3:使用 MainActivity.kt 文件

  • 在 MainActivity 中,kt 文件中的onSaveInstanceState(outState: Bundle)onRestoreInstanceState(savedInstanceState: Bundle)两个函数必须被覆盖,onSaveInstanceState函数将数据放入名为 outState 的包中,而 onRestoreInstanceState函数使用名为 savedInstanceState 的 Bundle 接收数据。请参阅上面提供的流程图以获得清晰的流程。
  • 要实现相同的调用,请在MainActivity.kt文件中调用以下代码。
  • 代码中添加了注释以更详细地理解代码。

科特林

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
  
class MainActivity : AppCompatActivity() {
  
    // instances of all the UI elements
    lateinit var editText: EditText
    lateinit var counterText: TextView
    lateinit var incrementB: Button
    lateinit var decrementB: Button
  
    // counter to increment or 
      // decrement the counter text
    var countInt: Int = 0
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // register all the UI elements with 
          // their appropriate IDs
        editText = findViewById(R.id.editText)
        incrementB = findViewById(R.id.incrementB)
        decrementB = findViewById(R.id.decrementB)
        counterText = findViewById(R.id.counterText)
  
        // handle the increment button
        incrementB.setOnClickListener {
            if (countInt >= 0) {
                countInt++
                counterText.text = countInt.toString()
            }
        }
  
        // handle the decrement button
        decrementB.setOnClickListener {
            if (countInt > 0) {
                countInt--
                counterText.text = countInt.toString()
            }
        }
    }
  
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
  
        // put the unique key value with the data
          // to be restored after configuration changes
        outState.putInt("counterData", countInt)
    }
  
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
  
        // get the stored data from the bundle using the unique key
        countInt = savedInstanceState.getInt("counterData")
  
        // update the UI
        counterText.text = countInt.toString()
    }
}

输出: