En Android, si la configuración de la aplicación cambia, por ejemplo, cuando se gira la pantalla de Android, algunos datos se pierden y se restablecen. Especialmente, los datos de las variables. Entonces, este problema se puede resolver anulando las funciones onSaveInstanaceState() y onRestoreInstanceState(). Entonces, en este artículo, se ha discutido cómo se puede resolver este problema en detalle usando el diagrama de flujo, para comprender cuándo se llaman estas funciones anteriores.
A continuación se muestra un diagrama de flujo que representa cómo se llama a los métodos y cómo se restauran y actualizan los datos en la interfaz de usuario:
Implementación paso a paso
Paso 1: crear un proyecto de actividad vacío
- Con Android Studio, cree un nuevo proyecto de Android Studio de actividad vacía. Consulte Android | ¿Cómo crear/comenzar un nuevo proyecto en Android Studio? , para saber cómo crear un proyecto de Android Studio de actividad vacía.
Paso 2: trabajar con el archivo activity_main.xml
- El diseño principal de la aplicación que contiene EditText , y un TextView y dos Buttons , que aumentan y disminuyen el valor de TextView.
- Para implementar la interfaz de usuario, invoque el siguiente código dentro del archivo activity_main.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" tools:ignore="HardcodedText"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="32dp" android:layout_marginEnd="16dp" android:hint="Enter Something" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/decrementB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="32dp" android:layout_marginTop="32dp" app:icon="@drawable/ic_remove" app:iconGravity="textStart" app:iconPadding="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText" /> <TextView android:id="@+id/counterText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:textSize="24sp" app:layout_constraintBottom_toBottomOf="@+id/incrementB" app:layout_constraintEnd_toStartOf="@+id/incrementB" app:layout_constraintHorizontal_bias="0.497" app:layout_constraintStart_toEndOf="@+id/decrementB" app:layout_constraintTop_toTopOf="@+id/incrementB" /> <Button android:id="@+id/incrementB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:layout_marginEnd="32dp" app:icon="@drawable/ic_add" app:iconGravity="textStart" app:iconPadding="0dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText" /> </androidx.constraintlayout.widget.ConstraintLayout>
Producción:
Paso 3: trabajar con el archivo MainActivity.kt
- En el archivo MainActivity,kt, las dos funciones onSaveInstanceState(outState: Bundle) y onRestoreInstanceState(savedInstanceState: Bundle) deben anularse, la función onSaveInstanceState coloca los datos en un paquete denominado outState y la función onRestoreInstanceState recibe los datos mediante el uso de Bundle denominado SavedInstanceState. Consulte el diagrama de flujo proporcionado anteriormente para obtener un flujo claro.
- Para implementar lo mismo, invoque el siguiente código dentro del archivo MainActivity.kt .
- Se agregan comentarios dentro del código para comprender el código con más detalle.
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() } }
Producción:
Publicación traducida automáticamente
Artículo escrito por adityamshidlyali y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA