如何使用捆绑包恢复 Android 中更改的配置数据?
在 Android 中,如果应用程序的配置发生变化,例如当 android 屏幕旋转时,那么一些数据会丢失并重置。尤其是来自变量的数据。所以这个问题可以通过重写onSaveInstanaceState()和onRestoreInstanceState() 函数来解决。所以在本文中,通过流程图详细讨论了如何解决此问题,以了解何时调用上述这些函数。请注意,我们将使用Kotlin语言来实现这个项目。
下面是一个流程图,表示如何在 UI 中调用方法以及恢复和更新数据:
想要一个更快节奏和更具竞争力的环境来学习 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()
}
}