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

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

Сохраненные данные, которые система использует для восстановления предыдущего состояния, называются состоянием экземпляра и представляют собой набор пар ключ-значение, хранящихся вСвязать объект. По умолчанию система использует состояние экземпляра 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?

Спасибо

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

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вы должны определить флаг, чтобы указать изменение состояния, обновить значение флага в методе 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);
    }
}
0 голосов
/ 31 мая 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");

...