Какие свойства сохраняются автоматически, без дополнительного кода? Цвет фона не восстанавливается в LinearLayout после поворота экрана

Я пытаюсь понять концепцию состояния экземпляра в Android. Документация доступна по адресу https://developer.android.com/guide/components/activities/activity-lifecycle описывает, что

Сохраненные данные, которые система использует для восстановления предыдущего состояния, называются состоянием экземпляра и представляют собой набор пар ключ-значение, хранящихся в объекте Bundle. По умолчанию система использует состояние экземпляра Bundle для сохранения информации о каждом объекте View в макете активности (например, текстовое значение, введенное в виджет EditText). Таким образом, если ваш экземпляр активности уничтожается и создается заново, состояние макета восстанавливается до прежнего состояния без необходимости кода. Однако у вашей активности может быть дополнительная информация о состоянии, которую вы хотели бы восстановить, например переменные-члены, которые отслеживают ход выполнения пользователем действия.

Примечание. Чтобы система Android восстанавливала состояние представлений в вашей активности, каждое представление должно иметь уникальный идентификатор, предоставляемый атрибутом android:id.

Я сделал пример со всеми описанными выше реквизитами, тем не менее, он все еще не работает так, как я ожидал: после нажатия кнопки и изменения цвета фона LinearLayout, который имеет уникальный идентификатор, он теряет цвет после поворота экрана. Однако переключатель остается выбранным, как и ожидалось.

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.widget.LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="?android:dividerHorizontal"
    android:orientation="vertical"
    android:padding="16dp"
    android:showDividers="middle">


    <android.widget.LinearLayout
        android:id="@+id/layout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:text="Question 1?" />


        <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <RadioButton
                android:id="@+id/radio_p1o1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="option1" />

            <RadioButton
                android:id="@+id/radio_p1o2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="option2" />

            <RadioButton
                android:id="@+id/radio_p1o3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="option3" />
        </RadioGroup>
    </android.widget.LinearLayout>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        android:onClick="changeColor"
        android:text="Change Background Color" />
</android.widget.LinearLayout>
</ScrollView>

и MainActivity.java

package com.example.android.testlinearlayoutpropertiessave;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import static android.graphics.Color.GREEN;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void changeColor(View view) {
        findViewById(R.id.layout1).setBackgroundColor(GREEN);
    }
}

Я делаю что-то неправильно, неправильно понял функциональность или есть какая-то причина, по которой он не сохраняет также backgroundColor LinearLayout?

Спасибо

P.S.: Я уже работаю, кодирую, просто хочу знать, какие свойства покрываются автоматически!


person pablo.vix    schedule 31.05.2018    source источник
comment
Возможный дубликат Перезапуск активности при ротации Android   -  person gmetax    schedule 31.05.2018
comment
проверьте поворот экрана и сохранитеInstanceState   -  person gmetax    schedule 31.05.2018
comment
Это описание вводит в заблуждение. Не все обрабатывается автоматически. Только определенные свойства автоматически сохраняются и восстанавливаются для определенных View. Текст EditText один из таких. Другие включают проверенное состояние CheckBox, положение прокрутки ListView и т. д. В основном, основные функциональные свойства данного типа View. Цвет фона LinearLayout не сохраняется и не восстанавливается автоматически. Вам нужно будет справиться с этим самостоятельно, как описано после этого цитируемого раздела на связанной странице.   -  person Mike M.    schedule 31.05.2018


Ответы (2)


Необходимо определить флаг, указывающий на изменение состояния, обновить значение флага в методе changeColor и реализовать метод onSaveInstanceState. Пример:

package com.example.android.testlinearlayoutpropertiessave;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import static android.graphics.Color.GREEN;

public class MainActivity extends AppCompatActivity {

    private boolean colorChanged = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState != null) {
            colorChanged = savedInstance.getBoolean("colorChanged");
        }

        if (colorChanged) {
            findViewById(R.id.layout1).setBackgroundColor(GREEN);
        }
    }

    public void changeColor(View view) {
        findViewById(R.id.layout1).setBackgroundColor(GREEN);
        colorChanged = true;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(colorChanged);
    }
}
person bra_racing    schedule 31.05.2018
comment
Хорошо, я заставил это работать, но я просто хочу знать, какие свойства сохраняются по умолчанию, а какие нет! Просто прочитав ссылку не понятно! - person pablo.vix; 04.06.2018
comment
Никакие свойства не сохраняются, если вы не сохранили их в методе onSaveInstanceState. При изменении состояния действия действие перезапускает свое состояние (и состояние переменных и визуальных компонентов) до значения по умолчанию. - person bra_racing; 04.06.2018

Вы должны получить savedInstanceState, чтобы что-то с ним делать.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore from saved state
    } else {
        // New instance
    }
    setContentView(R.layout.activity_main);

}

Это должно ответить на все оставшиеся вопросы

Что вы сохраните в своем пакете savedInstanceState, зависит только от вас.

Вы просто используете savedInstanceState.putInt("savedNum", 300); в вызове onSavedInstanceState, затем, вернувшись к своему представлению - в onCreate, проверьте, что savedInstanceState не равно нулю, и получите значение, используя int oldNum = savedInstanceState.getInt("savedNum");

person Jantzilla    schedule 31.05.2018
comment
Хорошо, у меня получилось переопределить метод saveOnInstance, но я просто хочу знать, какие свойства сохраняются по умолчанию, а какие нет! Просто прочитав ссылку не понятно! - person pablo.vix; 04.06.2018