Я сбит с толку, когда дело доходит до сохранения состояния. Итак, я знаю, что это onSaveInstanceState(Bundle)
вызывается, когда активность вот-вот будет уничтожена. Но как сохранить в нем информацию и вернуть ее в исходное состояние onCreate(Bundle savedInstanceState)
? Я не понимаю, как эта связка восстановит информацию. Было бы полезно, если бы кто-нибудь мог привести пример. Руководство разработчика не очень хорошо объясняет это.
public class Conversation extends Activity {
private ProgressDialog progDialog;
int typeBar;
TextView text1;
EditText edit;
Button respond;
private String name;
private String textAtView;
private String savedName;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dorothydialog);
text1 = (TextView)findViewById(R.id.dialog);
edit = (EditText)findViewById(R.id.repsond);
respond = (Button)findViewById(R.id.button01);
if(savedInstanceState != null){
savedInstanceState.get(savedName);
text1.setText(savedName);
}
else{
text1.setText("Hello! What is your name?");
respond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
name = edit.getText().toString();
text1.setText("Nice to meet you "+ name);
}
});
}
}
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putString(savedName, name);
}
}
Ответы:
Это
Bundle
контейнер для всей информации, которую вы хотите сохранить. Вы используете функции put * для вставки в него данных. Вот краткий список (их больше) функций put, которые вы можете использовать для хранения данных вBundle
.В вашей
onCreate
функции этоBundle
передается программе. Лучший способ проверить, перезагружается ли приложение или запускается впервые:Чтобы вернуть данные, используйте функции get * точно так же, как функции put *. Данные хранятся в виде пары имя-значение. Это похоже на хэш-карту. Вы предоставляете ключ и значение, затем, когда вы хотите вернуть значение, вы даете ключ, и функция получает значение. Вот небольшой пример.
Ваше сохраненное сообщение будет отображаться на экране. Надеюсь это поможет.
источник
Одно важное замечание, которое должны знать все новые разработчики Android, - это то, что любая информация в виджетах (TextView, Buttons и т. Д.) Будет автоматически сохраняться Android до тех пор, пока вы назначите им идентификатор. Это означает, что о большей части состояния пользовательского интерфейса заботятся без проблем. Только когда вам нужно сохранить другие данные, это становится проблемой.
Из Android Docs :
источник
Хорошая информация: вам не нужно проверять, является ли объект Bundle нулевым в методе onCreate (). Используйте метод onRestoreInstanceState (), который система вызывает после метода onStart (). Система вызывает onRestoreInstanceState () только при наличии сохраненного состояния для восстановления, поэтому вам не нужно проверять, является ли Bundle нулевым.
источник
Информация о магазине:
Если вы не хотите восстанавливать информацию в своем onCreate-Method:
Вот примеры: воссоздание действия
источник
В основном onSaveInstanceState (Bundle outBundle) предоставит вам пакет. Когда вы посмотрите на класс Bundle, вы увидите, что в него можно поместить много разных вещей. При следующем вызове onCreate () вы просто получаете этот Bundle в качестве аргумента. Затем вы можете снова прочитать свои значения и восстановить свою активность.
Допустим, у вас есть действие с EditText. Пользователь написал внутри него какой-то текст. После этого система вызывает ваш onSaveInstanceState (). Вы читаете текст из EditText и записываете его в Bundle через Bundle.putString ("edit_text_value", theValue).
Теперь вызывается onCreate. Вы проверяете, не является ли поставляемый комплект нулевым. Если это так, вы можете восстановить свое значение через Bundle.getString ("edit_text_value") и вернуть его в свой EditText.
источник
Это для дополнительной информации.
Представьте себе этот сценарий
ActivityB запускает новый ActivityAPrime от
ActivityAPrime не имеет отношения к ActivityA.
В этом случае Bundle в ActivityAPrime.onCreate () будет нулевым.
Если ActivityA и ActivityAPrime должны быть одним и тем же действием, а не разными, ActivityB должен вызывать finish (), а не startActivity ().
источник
Если данные не загружены из,
savedInstanceState
используйте следующий код.Проблема в том, что вызов URL-адреса не завершен полностью, поэтому проверьте, загружены ли данные, а затем отобразите значение instanceState.
источник