Восстановление состояния TextView после поворота экрана?

В моем приложении у меня есть TextView и EditText. Оба имеют в нем данные. Когда ориентация экрана изменяет данные в EditText, но данные TextView очищаются.

Может ли кто-нибудь помочь мне найти способ сохранить данные в TextView тоже?

Ответ 1

Если вы хотите, чтобы ваш TextView сохранил свое состояние, вы должны добавить атрибут freezesText:

<TextView 
     ... 
     android:freezesText="true" />

Из документации по freezesText:

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

Ответ 2

Чтобы сохранить данные об изменении ориентации, вам необходимо реализовать два метода:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}

Ответ 3

Android не обрабатывает подобные вещи для вас. Вы сохраняете все данные вручную.

Вы можете использовать в операции для сохранения значений

@Override
    public Object onRetainNonConfigurationInstance() {
        HashMap<String, Object> savedValues = new HashMap<String, Object>();
        savedValues.put("someKey", someData);           
        return savedValues;
    }

и использовать что-то подобное в методе oncreate для загрузки сохраненных объектов

HashMap < String, Object> savedValues 
     = (HashMap<String, Object>)this.getLastNonConfigurationInstance();

вы также можете выбрать изменение ориентации отключения для активности

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

Ответ 4

1) Не все виды с идентификатором сохраняют свое состояние. Виджеты Android с идентификатором, состояние которого может быть изменено пользователем, похоже, сохраняют свое состояние при мягком убийстве. Поэтому EditText сохраняет свое состояние, но TextView не сохраняет свое состояние при мягком убийстве.

"AFAIK, Android только беспокоит сохранение состояния для вещей, которые, как ожидается, будут изменение. Вот почему он сохраняет текст в EditText (который пользователь вероятно, изменится) и, возможно, не сохранит состояние для TextView (который обычно остается статическим) "

Mark M

Таким образом, вы можете сохранить состояние текстового представления в onSaveInstanceState, и вы можете выбрать восстановление состояния текстового представления в onCreate.

2) Лучшей практикой является сохранение "внутреннего" состояния представления без просмотра, даже если вы объявляете

android:configChanges= "orientation|keyboardHidden" 

Из документов:

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

JAL

Ответ 5

Измените свои действия в AndroidManifest.xml, чтобы переопределить поведение изменения ориентации, добавив это в свою активность/действия:

android:configChanges="orientation|keyboardHidden"

Он должен выглядеть примерно так:

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>

Ответ 6

Добавьте их в AndroidManifest.xml
Поместите название вашей деятельности вместо Activity_Name

<activity android:name="Activity_Name"
        android:screenOrientation="sensor"
        ...
        android:configChanges="orientation|keyboardHidden|screenSize">

Это также будет работать с изменением значения TextField.

Ответ 7

просто добавь

android:configChanges="orientation|screenSize"

к вашей активности в AndroidManifest.xml.

Ответ 8

При изменении конфигурации Android по умолчанию перезапускает вашу активность. Чтобы изменить это, вы должны переопределить метод onConfigurationChanged(). Кроме того, вы должны добавить android:configChanges в файл манифеста.

Вы можете прочитать здесь.

Ответ 9

Я также использовал

android:configChanges="orientation"

и это не сработало.

Но потом я нашел решение.

Проверьте, правильно ли у вас есть следующая строка:

<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />

убедитесь, что он не читает что-то вроде

<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`

У меня был второй способ на первом месте, но когда я исправил это состояние, оно сохранилось.