Как использовать пример onSavedInstanceState, пожалуйста
Я в замешательстве, когда дело доходит до сохранения состояния. Итак, я знаю, что onSaveInstanceState(Bundle)
вызывается, когда активность собирается быть уничтоженной. Но как вы храните в нем свою информацию и возвращаете ее в исходное состояние в onCreate(Bundle savedInstanceState)
? Я не понимаю, как этот пакет будет восстанавливать информацию. Было бы полезно, если кто-то может привести пример. Руководство Dev не очень хорошо объясняет это.
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);
}
}
7 ответов
Bundle
является контейнером для всей информации, которую вы хотите сохранить. Вы используете функции put* для вставки данных в него. Вот краткий список (есть еще) функций пут, которые вы можете использовать для хранения данных в Bundle
,
putString
putBoolean
putByte
putChar
putFloat
putLong
putShort
putParcelable (used for objects but they must implement Parcelable)
В вашем onCreate
функция, это Bundle
возвращается в программу. Лучший способ проверить, перезагружается ли приложение или запускается впервые:
if (savedInstanceState != null) {
// Then the application is being reloaded
}
Чтобы вернуть данные, используйте функции get*, как и функции put*. Данные хранятся в виде пары имя-значение. Это похоже на хэш-карту. Вы предоставляете ключ и значение, затем, когда вы хотите вернуть значение, вы даете ключ, и функция получает значение. Вот короткий пример.
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("message", "This is my message to be reloaded");
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String message = savedInstanceState.getString("message");
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
Ваше сохраненное сообщение будет отображаться на экране. Надеюсь это поможет.
Одно важное замечание, которое должны знать все новые разработчики Android, заключается в том, что любая информация в виджетах (TextView, Buttons и т. Д.) Будет автоматически сохраняться Android, пока вы назначаете им идентификатор. Таким образом, это означает, что большая часть состояния пользовательского интерфейса решается без проблем. Только когда вам нужно сохранить другие данные, это становится проблемой.
Единственное, что от вас требуется - предоставить уникальный идентификатор (с атрибутом android: id) для каждого виджета, для которого вы хотите сохранить его состояние. Если виджет не имеет идентификатора, он не может сохранить свое состояние
Хорошая информация: вам не нужно проверять, является ли объект Bundle нулевым, в методе onCreate (). Используйте метод onRestoreInstanceState (), который система вызывает после метода onStart (). Система вызывает onRestoreInstanceState (), только если существует сохраненное состояние для восстановления, поэтому вам не нужно проверять, является ли Bundle нулевым
Информация о магазине:
static final String PLAYER_SCORE = "playerScore";
static final String PLAYER_LEVEL = "playerLevel";
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore);
savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Если вы не хотите восстанавливать информацию в вашем методе onCreate:
Вот примеры: воссоздание деятельности
Вместо восстановления состояния во время onCreate() вы можете выбрать реализацию onRestoreInstanceState(), которую система вызывает после метода onStart(). Система вызывает onRestoreInstanceState(), только если существует сохраненное состояние для восстановления, поэтому вам не нужно проверять, является ли Bundle нулевым
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}
В основном onSaveInstanceState(Bundle outBundle) даст вам пакет. Когда вы посмотрите на класс Bundle, вы увидите, что вы можете поместить в него много разных вещей. При следующем вызове onCreate() вы просто возвращаете этот Bundle в качестве аргумента. Затем вы можете снова прочитать ваши значения и восстановить свою активность.
Допустим, у вас есть действие с EditText. Пользователь написал текст внутри него. После этого система вызывает ваш onSaveInstanceState(). Вы читаете текст из EditText и записываете его в Bundle через Bundle.putString("edit_text_value", theValue).
Теперь onCreate называется. Вы проверяете, является ли поставляемый комплект не нулевым. Если это так, вы можете восстановить свое значение с помощью Bundle.getString("edit_text_value") и вернуть его обратно в свой EditText.
Это для дополнительной информации.
Представьте себе этот сценарий
- ActivityA запустить ActivityB.
ActivityB запускает новый ActivityAPrime
Intent intent = new Intent(getApplicationContext(), ActivityA.class); startActivity(intent);
ActivityAPrime не имеет отношения к ActivityA.
В этом случае Bundle в ActivityAPrime.onCreate() будет нулевым.
Если ActivityA и ActivityAPrime должны быть одним и тем же действием вместо разных действий, ActivityB должен вызывать finish(), чем при использовании startActivity().
Если данные не загружены из savedInstanceState
используйте следующий код.
Проблема заключается в том, что URL-вызов не завершается полностью, поэтому проверьте, загружены ли данные, чтобы показать значение instanceState.
//suppose data is not Loaded to savedInstanceState at 1st swipe
if (savedInstanceState == null && !mAlreadyLoaded){
mAlreadyLoaded = true;
GetStoryData();//Url Call
} else {
if (listArray != null) { //Data Array From JsonArray(ListArray)
System.out.println("LocalData " + listArray);
view.findViewById(R.id.progressBar).setVisibility(View.GONE);
}else{
GetStoryData();//Url Call
}
}