Сохранить элементы пользовательского интерфейса в состоянии активности - PullRequest
0 голосов
/ 25 апреля 2020

Я совершенно новичок в java и android. У меня есть следующие настройки пользовательского интерфейса:

<?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">

    <EditText
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ...
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        ...>

        <LinearLayout
            android:id="@+id/linLay"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" />

    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

Во время выполнения некоторые TextViews будут добавлены к LinearLayout. У меня есть следующая проблема. Телефон отключается, динамически добавленное TextViews исчезает. Причина в том, что метод действия onCreate(Bundle savedInstanceState) вызывается, если вы перевернули телефон.

Я установил следующий метод, чтобы сохранить состояние экземпляра (textViews является членом класса Activity (Vector) ):

protected void onSaveInstanceState(Bundle state) {

        super.onSaveInstanceState(state);

        //Save the TextViews
        textViews.removeAllElements();
        LinearLayout layout = getLinearLayout();
        while (layout.getChildCount() > 0)
        {
            View view = layout.getChildAt(0);

            if (view instanceof TextView)
            {
                layout.removeView(view);
                textViews.add((TextView) view);
            }
        }

        state.putSerializable("textViews", textViews);
    }

Я реализовал этот код в методе onCreate(Bundle savedInstanceState) для восстановления TextViews:

LinearLayout linLay = getLinearLayout();

//Load TextViews
if ((savedInstanceState != null) && (savedInstanceState.getSerializable("textViews") != null))
{
    Serializable serializable = savedInstanceState.getSerializable("textViews");

    if (serializable instanceof Vector)
    {
        textViews= (Vector<TextView>) serializable;
    }
}

if (textViews!= null) {
    for (TextView textView : textViews) {
        linLay.addView(textView);
    }
}

Этот код работает для проблемы с переворачиванием, но создает новую проблему. Если я нажимаю кнопку «Домой», я получаю следующую ошибку:

Посылка: невозможно определить значение

Я прочитал, что проблема в том, что Vector<TextView> не сериализуем , Но почему переворачивание телефона не влияет на эту ошибку? Я отлаживаю приложение, и я уверен, что метод state.putSerializable(...) вызывается, если телефон перевернут.

Как бы вы сохранили TextView вместо этого? Невозможно сохранить String вместо TextView, потому что backgroundResource из TextViews отличаются.

1 Ответ

1 голос
/ 25 апреля 2020

Я знаю, что это int решение, но выслушай меня. TextViews - это куча текста на экране, верно? Мой совет: когда воссоздание активности произойдет, не сохраняйте TextViews, а сами сохраняйте текст в TextView. и после этого используйте их, чтобы нарисовать новые. это более логично, более оптимизировано, и с помощью ViewModel это может стать более элегантным, если хранить эти тексты в LiveData List и наблюдать и реагировать в действии. Вот документация для этого: LiveData и ViewModel

...