Jestem zdezorientowany, jeśli chodzi o ratowanie stanu. Więc wiem, że onSaveInstanceState(Bundle)
jest to wywołane, gdy działalność ma zostać zniszczona. Ale w jaki sposób przechowujesz w nim swoje informacje i przywracasz je do pierwotnego stanu onCreate(Bundle savedInstanceState)
? Nie rozumiem, jak ten pakiet przywróci informacje. Byłoby pomocne, gdyby ktoś mógł podać przykład. Przewodnik dla programistów nie wyjaśnia tego dobrze.
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);
}
}
Odpowiedzi:
Bundle
Jest pojemnik do wszystkich informacji, które chcesz zapisać. Używasz funkcji put *, aby wstawiać do niego dane. Oto krótka lista (jest ich więcej) funkcji put, których możesz użyć do przechowywania danych wBundle
.W twojej
onCreate
funkcjiBundle
jest to zwracane do programu. Najlepszym sposobem sprawdzenia, czy aplikacja jest przeładowywana lub uruchamiana po raz pierwszy, jest:Aby odzyskać dane, użyj funkcji get * tak samo jak funkcji put *. Dane są przechowywane jako para nazwa-wartość. To jest jak hasz. Podajesz klucz i wartość, a następnie, gdy chcesz odzyskać wartość, podajesz klucz, a funkcja pobiera wartość. Oto krótki przykład.
Twoja zapisana wiadomość zostanie wyświetlona na ekranie. Mam nadzieję że to pomoże.
źródło
Jedną z głównych uwag, o których powinni wiedzieć wszyscy nowi programiści Androida, jest to, że wszelkie informacje w widżetach (TextView, przyciski itp.) Będą automatycznie utrwalane przez Androida, o ile przypiszesz im identyfikator. Oznacza to, że większość stanu interfejsu użytkownika jest obsługiwana bez problemu. Tylko wtedy, gdy musisz przechowywać inne dane, staje się to problemem.
Z Dokumentów na Androida :
źródło
Dobra informacja: nie musisz sprawdzać, czy obiekt Bundle ma wartość null w metodzie onCreate (). Należy użyć metody onRestoreInstanceState (), którą system wywołuje po metodzie onStart (). System wywołuje metodę onRestoreInstanceState () tylko wtedy, gdy istnieje zapisany stan do przywrócenia, więc nie ma potrzeby sprawdzania, czy pakiet jest pusty
źródło
Przechowaj informację:
Jeśli nie chcesz przywracać informacji w metodzie onCreate:
Oto przykłady: Odtwarzanie działania
źródło
Zasadniczo onSaveInstanceState (Bundle outBundle) da ci pakiet. Kiedy spojrzysz na klasę Bundle, zobaczysz, że możesz włożyć do niej wiele różnych rzeczy. Przy następnym wywołaniu onCreate () po prostu otrzymujesz ten pakiet jako argument. Następnie możesz ponownie odczytać swoje wartości i przywrócić swoją aktywność.
Powiedzmy, że masz działanie z EditTextem. Użytkownik napisał w nim jakiś tekst. Następnie system wywołuje metodę onSaveInstanceState (). Czytasz tekst z EditText i zapisujesz go w pakiecie poprzez Bundle.putString ("edit_text_value", theValue).
Teraz nazywa się onCreate. Sprawdzasz, czy dostarczony pakiet nie jest zerowy. W takim przypadku możesz przywrócić swoją wartość poprzez Bundle.getString ("edit_text_value") i umieścić ją z powrotem w EditText.
źródło
To jest dla dodatkowych informacji.
Wyobraź sobie taki scenariusz
ActivityB uruchom nowy ActivityAPrime przez
ActivityAPrime nie ma związku z ActivityA.
W tym przypadku pakiet w ActivityAPrime.onCreate () będzie miał wartość NULL.
Jeśli ActivityA i ActivityAPrime powinny być tym samym działaniem, a nie różnymi działaniami, ActivityB powinno wywołać finish () niż użycie startActivity ().
źródło
Jeśli dane nie są ładowane z,
savedInstanceState
użyj następującego kodu.Problem polega na tym, że wywołanie adresu URL nie jest w pełni zakończone, więc sprawdź, czy dane są załadowane, a następnie pokaż wartość instanceState.
źródło