Восстановление состояния TextView после поворота экрана? - PullRequest
102 голосов
/ 03 марта 2011

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

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

Ответы [ 9 ]

218 голосов
/ 23 мая 2011

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

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

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

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

28 голосов
/ 03 марта 2011

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

@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);
}
6 голосов
/ 03 марта 2011

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

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

Марка М

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

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

android:configChanges= "orientation|keyboardHidden" 

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

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

JAL

6 голосов
/ 03 марта 2011

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 голос
/ 03 марта 2011

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

android:configChanges="orientation|keyboardHidden"

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

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>
0 голосов
/ 20 января 2019

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

android:configChanges="orientation|screenSize"

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

0 голосов
/ 06 апреля 2018

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

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

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

0 голосов
/ 14 июля 2012

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

android:configChanges="orientation"

, и он не работал.

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

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

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

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

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

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

0 голосов
/ 03 марта 2011

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

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

...