#android
#Android
Вопрос:
Почему состояние пользовательского интерфейса сохраняется, даже если активность уничтожается и создается заново:
Мое действие имеет EditText, и если я напишу в нем какой-нибудь текст, например. ABC и когда я поворачиваю его, вызывается onDestroy, а затем onCreate (), поэтому Edittext должен быть пустым, но в нем все еще есть старый текст.
Моя Деятельность:
public class MainActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
debugLog("( ) Create called");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
debugLog("( ) onResume called");
super.onResume();
}
@Override
protected void onPause() {
debugLog("( ) onPause called");
super.onPause();
}
@Override
protected void onDestroy() {
debugLog("( ) onDestroy called");
super.onDestroy();
}
private void debugLog(String str) {
Log.d("SAMPLE APP",str);
}
}
XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}"
android:orientation="vertical"
android:padding="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name: "
android:singleLine="true"
android:textSize="16sp"
android:textColor="#000000" />
<EditText
android:id="@ id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hobbies:"
android:singleLine="true"
android:textSize="16sp"
android:textColor="#000000"
android:layout_marginTop="10dp"/>
<CheckBox
android:id="@ id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Table Tennis"
android:layout_marginTop="10dp"/>
</LinearLayout>
Войдите в систему при изменении ориентации:
( ) onDestroy called
( ) onPause called
( ) onCreate called
( ) onResume called
Ответ №1:
По умолчанию система использует состояние экземпляра пакета для сохранения информации о каждом объекте просмотра в вашем макете действия (например, текстовое значение, введенное в объект EditText). Итак, если ваш экземпляр activity уничтожается и создается заново, состояние макета восстанавливается до его предыдущего состояния без какого-либо кода, требуемого вами. Однако в вашем действии может содержаться дополнительная информация о состоянии, которую вы хотели бы восстановить, например, переменные-члены, которые отслеживают прогресс пользователя в выполнении действия.
Примечание: Для того, чтобы система Android восстановила состояние представлений в вашей активности, каждое представление должно иметь уникальный идентификатор, предоставляемый атрибутом android: id.
Чтобы сохранить дополнительные данные о состоянии активности, вы должны переопределить метод обратного вызова onSaveInstanceState(). Система вызывает этот метод, когда пользователь покидает вашу активность, и передает ему объект Bundle, который будет сохранен в случае, если ваша активность неожиданно будет уничтожена. Если системе необходимо воссоздать экземпляр activity позже, она передает один и тот же объект Bundle методам onRestoreInstanceState() и onCreate().
Комментарии:
1. Таким образом, мы не должны беспокоиться о потере состояния пользовательского интерфейса, например, текста в edittext или состояния флажка, и нам не нужно сохранять их в onPause в настройках и т.д.
2. Ну, это зависит от того, воссоздает ли система Android вашу активность, тогда она будет восстановлена при условии, что вы указали атрибут android: id. Но если вы завершаете это самостоятельно или переходите к какой-либо другой деятельности, вам следует сохранить эти данные.
Ответ №2:
Android сохраняет содержимое некоторых виджетов по умолчанию, таких как EditText, до тех пор, пока у него есть идентификатор.
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться документацией, подтверждающей ваш ответ… Я ничего не нашел в EditText.java где реализовано сохранение состояния
2. У @abhishesh есть более подробный ответ, чем у меня.