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