Android View не уважает состояние Bundle, будучи воссозданным без учета информации о Bundle - PullRequest
0 голосов
/ 07 ноября 2018

Просмотр не использует автоматически сгенерированную информацию Bundle.

Поиск переполнения стека не дал результатов по этому поводу.Вид не настраивается, имеет уникальный идентификатор.Не дублируется ли:

findViewById не работает для включения?

FindViewById () не находит View

Android: findviewbyid: поиск представления по идентификатору, когда представление не в том же макете, вызванном setContentView

Другие представления работают должным образом.Единственное, что не добавлено как добавление, это единственное отличие, которое я смог найти.

Описание проблемы: Вид скрыт, Активность воссоздана, Вид показан.

Подробности: У меня есть кнопка, которая использует атрибут android:onClick по умолчанию, который вызывает метод.Этот метод работает, как и ожидалось.Затем я «переворачиваю» Android-устройство, ориентация которого меняется, в результате чего он вызывает onSaveInstanceState(Bundle b).Информация об Деятельности связывается, Активность уничтожается и воссоздается, затем сохраненный Пакет отправляется на onCreate(Bundle b), как и ожидалось.

Затем, согласно Деятельности Android, Пакет восстанавливает состояния просмотра.

За исключением одного представления

class ExampleActivity extends AppCompatActivity {
    public void hide(View view){
        view.setVisibility(View.GONE);
    }
}

XML деятельности

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    style="@style/linear_layout_style"
    tools:context=".ExampleActivity">
        <View style="@style/another_style" />
        <include layout="@layout/included_xml" />
        <View style="@style/another_style" />
</LinearLayout>

Включенный XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/linear_layout_style">

    <!-- This was supposed to stay hidden after pressed, but it restores in a VISIBLE state -->
    <Button
        style="@style/the_style"
        android:id="@+id/an_unique_id"
        android:onClick="hide"
        android:text="EXAMPLE: Hide" />

    <!-- This is supposed to always be visibile, and it does -->
    <Button
        style="@style/the_style"
        android:onClick="doOtherStuff"
        android:text="Example: Always Available">

        <requestFocus />
    </Button>
</LinearLayout>

1 Ответ

0 голосов
/ 07 ноября 2018

Сохраненный экземпляр не сохраняет все. Я посмотрел на источник для TextView (Button расширяется и не намного больше, чем TextView), и он не сохраняет видимость. Фактически, единственное, что он сохраняет, - это выделение текста и текста, но только в том случае, если вы назовете setFreezesText(true). Точно так же View.onSaveInstanceState() ничего не делает (просто возвращает пустое сохраненное состояние).

Итак, вам нужно вручную сохранить и восстановить их самостоятельно. Это та область, где я думаю, что Android сделал очень плохо. Документы говорят:

Реализация по умолчанию заботится о большей части пользовательского интерфейса для каждого экземпляра. для вас, вызывая View.onSaveInstanceState () для каждого представления в иерархия, которая имеет идентификатор, и путем сохранения идентификатора текущего сфокусированное представление (все из которых восстанавливается реализацией по умолчанию onRestoreInstanceState (Bundle)).

что, похоже, вводит в заблуждение после просмотра источника платформы. Я имею в виду, вот реализация View.onSaveInstanceState() от Нуга:

protected Parcelable onSaveInstanceState() {
    mPrivateFlags |= PFLAG_SAVE_STATE_CALLED;
    if (mStartActivityRequestWho != null) {
        BaseSavedState state = new BaseSavedState(AbsSavedState.EMPTY_STATE);
        state.mStartActivityRequestWhoSaved = mStartActivityRequestWho;
        return state;
    }
    return BaseSavedState.EMPTY_STATE;
}

Я склонен не соглашаться с тем, что это «заботится о большей части» работы.

...