¿Cómo restaurar datos en la configuración modificada en Android usando paquetes?

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:

Restore Data on Configuration Changed in Android using Bundles

Implementación paso a paso

Paso 1: crear un proyecto de actividad vacío

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *