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

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

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

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 не сохраняет свое состояние при мягком убийстве.

" AFAIK, Android беспокоит только сохранение состояния для вещей, которые, как ожидается, изменение. Именно поэтому он сохраняет текст в 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">

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


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

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


Я тоже

android:configChanges="orientation"

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

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

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

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

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

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

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