Продолжаем курс по обучению основам разработки мобильных приложений в Android Studio на языке Kotlin.

Это урок 7, в котором разберемся, зачем сохранять состояние активити при изменениях конфигурации и какие инструменты для этого лучше использовать.
Предыдущий урок, на котором мы разбирали жизненный цикл активити, здесь.

Технологии и инструменты, используемые в уроке:

Зачем сохранять состояние активити?

Создадим приложение. В макет экрана добавим поле для ввода текста и кнопку. Также оставим здесь текстовое поле по умолчанию, только изменим размер текста. Убедимся, что каждый элемент макета экрана имеет идентификатор. Код макета экрана:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       tools:context=".MainActivity">

   <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:id="@+id/textView"
           app:layout_constraintBottom_toBottomOf="parent"
           app:layout_constraintLeft_toLeftOf="parent"
           app:layout_constraintRight_toRightOf="parent"
           android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/editText"
           app:layout_constraintHorizontal_bias="0.503" app:layout_constraintVertical_bias="0.191"
           android:textSize="24sp" android:typeface="normal"/>
   <EditText
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:inputType="textPersonName"
           android:ems="10"
           app:layout_constraintTop_toTopOf="parent"
           app:layout_constraintStart_toStartOf="parent"
           android:layout_marginTop="16dp"
           android:layout_marginStart="16dp"
           android:id="@+id/editText"/>
   <Button
           android:text="Button"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:id="@+id/button" app:layout_constraintStart_toEndOf="@+id/editText"
           android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp"
           app:layout_constraintHorizontal_bias="0.0"
           app:layout_constraintTop_toTopOf="@+id/editText" app:layout_constraintBottom_toBottomOf="@+id/editText"/>

</android.support.constraint.ConstraintLayout>

В теле функции onCreate присвоим слушатель кнопке. По ее нажатию будем отправлять набранный текст из поля editText в поле textView.  

button.setOnClickListener {
   textView.text = editText.text
}

Зачем нам нужно сохранять состояние? Для ответа на этот вопрос запустим приложение сейчас. Напишем какой-то текст в editText и нажмем кнопку. Текст передался в текстовое поле, все ок. Но стоит нам повернуть устройство, как текст исчезает. Это происходит потому, что активити пересоздается, соответственно, пересоздаются все экранные компоненты. Но в editText текст сохраняется, если поле имеет идентификатор, а в textView ничего не сохраняется.

Активити уничтожается и создается заново не только при повороте устройства, а и при других изменениях конфигурации, таких как смена локали, изменение размера экрана, переход в многооконный режим или даже подключение физической клавиатуры. Во всех случаях данные текстового поля будут потеряны.

Функция onSaveInstanceState()

Для сохранения текста в textView можно воспользоваться объектом savedInstanceState, который приходит в качестве параметра в функцию onCreate(). Объект savedInstanceState имеет тип Bundle, который представляет собой набор пар “ключ — значение” и может быть использован для сохранения предыдущего состояния активити. Для сохранения данных в объект savedInstanceState используется функция onSaveInstanceState().

Переопределим функцию onSaveInstanceState() с набором данных Bundle. В теле функции run объекта бандла вызываем функцию putString для создания элемента коллекции с ключом “KEY” и текстом из editText в качестве значения.   

override fun onSaveInstanceState(outState: Bundle?) {

   outState?.run {
       putString("KEY", textView.text.toString())
   }

   super.onSaveInstanceState(outState)
}

Также переопределим функцию onRestoreInstanceState, которая вызывается при старте активити в том случае, если имеется бандл, ранее сохраненный функцией onSaveInstanceState. В теле функции onRestoreInstanceState мы можем получить из бандла и передать в текстовое поле ранее сохраненный текст.

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
   super.onRestoreInstanceState(savedInstanceState)

   textView.text = savedInstanceState?.getString("KEY")
}

Теперь запустите приложение и убедитесь, что при смене конфигурации активити текст, переданный в TextView, сохраняется.


admin

Обучающие видео-уроки по разработке приложений для операционной системы Android. Мы поможем любому новичку стать продвинутым разработчиком андроид-приложений!

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.