Мои представления сбрасываются при изменении ориентации

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

Но когда ориентация изменяется, изображение сбрасывается до значения по умолчанию в макете.

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

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




Ответы (2)


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

 <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. У вас должны быть очень веские причины для его использования, и обычно это соображения производительности. Он не предназначался для злоупотреблений, как сейчас: просто для предотвращения сброса состояния пользовательского интерфейса. Если этот атрибут используется, то да, пользовательский интерфейс активности не будет переустанавливаться при изменении конфигурации, но состояние активности все равно будет сброшено при уничтожении и повторном создании позже.

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

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

person inazaruk    schedule 17.08.2011
comment
Итак, это звучит как гораздо лучший подход. Вместо этого я могу использовать это для растрового изображения, и тогда текст редактирования не будет проблемой. Но какую функцию я буду использовать для сохранения состояния изображения? - person Sebastian; 17.08.2011
comment
Если растровое изображение сохранено на диске, то просто сохраните путь к растровому изображению в функции onSaveInstanceState(). Если растровое изображение находится в памяти, вы можете использовать onRetainNonConfigurationInstance(). - person inazaruk; 17.08.2011

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

person superM    schedule 17.08.2011
comment
Но разве это не заставит активность не приспосабливаться к тому, что телефон лежит боком? - person Sebastian; 17.08.2011
comment
Это правильный ответ. Тот, который не позволяет экрану менять ориентацию, это android:screenOrientation="portrait" - person romy_ngo; 17.08.2011
comment
Хотя это исправляет этот конкретный случай, это не устраняет основную проблему. И android:configChanges считается последним средством, и обычно его никогда не следует использовать. developer.android.com/guide/topics/resources/ - person inazaruk; 17.08.2011
comment
то, что сложно обрабатывать изменения конфигурации самостоятельно, не означает, что его не следует использовать, если у кого-то есть мужество и он знает наизнанку (знает, во что он вступает), то обязательно сделайте это. - person Alex; 18.05.2020