Мои взгляды сбрасываются при изменении ориентации - PullRequest
6 голосов
/ 17 августа 2011

У меня есть небольшая активность с EditText и просмотром изображений и кнопкой. Когда вы нажимаете кнопку, она запускает камеру для результата, а когда она возвращает, она меняет вид изображения на только что сделанную вами фотографию.

Но когда ориентация меняется, вид изображения возвращается к стандартному виду на макете.

Я пытался установить логическое значение custom, а когда вы делаете снимок, оно устанавливает его в true. Я перезаписываю onConfigurationChanged () и, если для custom установлено значение true, я восстанавливаю образ.

Моя проблема теперь заключается в том, что EditText стирается. Как я могу восстановить EditText после изменения конфигурации? Моей первой попыткой было сохранить его содержимое в String onPause (), а затем восстановить его, но оно всегда отображается пустым.

Ответы [ 2 ]

15 голосов
/ 17 августа 2011

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

 <EditText android:id="@+id/text" ... />

Если это не поможет, вам нужно сохранить и восстановить состояние самостоятельно. Взгляните на Обработка изменений во время выполнения . Это в значительной степени объясняет, что вы должны делать:

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

Вы должны переопределить onSaveInstanceState() и сохранить свое состояние Активности, когда оно вызывается:

@Override
protected void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);
    outState.putString("textKey", mEditText.getText().toString());
}

А затем восстановить состояние в onCreate() или onRestoreInstanceState():

public void onCreate(Bundle savedInstanceState)
{
    if(savedInstanceState != null)
    {
        mEditText.setText(savedInstanceState.getString("textKey"));
    }
}

Если этого по-прежнему недостаточно, вы можете переопределить onRetainNonConfigurationInstance() и вернуть любой пользовательский объект, который будет передан новому объекту активности, когда он будет воссоздан. Более подробную информацию о том, как его использовать, можно найти в Обработка изменений времени выполнения . Но эта функция устарела в Android 3.0+ (специально для FragmentActivity, где она финальная). Так что это нельзя использовать вместе с фрагментами (это нормально, у них есть механизм для сохранения объектов при изменениях конфигурации).


И последнее - никогда не используйте android:configChanges. У вас должны быть очень веские причины для его использования, и обычно это причины производительности. Это не было предназначено для злоупотребления, как сейчас: просто для предотвращения сброса состояния пользовательского интерфейса. Если этот атрибут используется, то да, пользовательский интерфейс Activity не будет переустанавливаться при изменении конфигурации, но состояние Activity все равно будет сброшено при уничтожении и повторном создании позже.

Документация довольно хорошо объясняет эту опцию:

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

4 голосов
/ 17 августа 2011

Вы можете заставить свою деятельность не перезагружаться после изменения ориентации, добавив android:configChanges="orientation" к строке своей деятельности в манифесте.

...