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


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

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

8 101

8 ответов:

если вы хотите заставить ваш TextView для сохранения его состояния необходимо добавить freezesText:

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

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

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

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

@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);
}

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>

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

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

Знак М

Так что вы можете выбрать, чтобы сохранить состояние представления TextView в данные метода onsaveinstance и вы можете выбрать, чтобы восстановить состояние объекта TextView в onCreate.

2) рекомендуется сохранить" внутреннее " состояние экземпляра без представления, даже если вы объявите

android:configChanges= "orientation|keyboardHidden" 

документы:

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

JAL

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

android:configChanges="orientation|keyboardHidden"

Это должно выглядеть так:

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

добавить в AndroidManifest.XML
поместите свое имя активности вместо Activity_Name

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

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

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

Вы можете подробнее здесь.

Я тоже

android:configChanges="orientation"

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

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

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

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

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

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

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