Ich bin verwirrt, wenn es darum geht, einen Staat zu retten. Ich weiß also, dass dies onSaveInstanceState(Bundle)
aufgerufen wird, wenn die Aktivität zerstört werden soll. Aber wie speichern Sie Ihre Informationen darin und bringen sie in ihren ursprünglichen Zustand zurück onCreate(Bundle savedInstanceState)
? Ich verstehe nicht, wie dieses Bundle Informationen wiederherstellt. Es wäre hilfreich, wenn jemand ein Beispiel geben könnte. Der Dev-Guide erklärt dies nicht gut.
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);
}
}
Antworten:
Das
Bundle
ist ein Container für alle Informationen, die Sie speichern möchten. Mit den Funktionen put * fügen Sie Daten ein. Hier ist eine kurze Liste (es gibt mehr) von Put-Funktionen, mit denen Sie Daten in der speichern könnenBundle
.In Ihrer
onCreate
Funktion ist diesBundle
an das Programm zurückgegeben. Der beste Weg, um zu überprüfen, ob die Anwendung neu geladen oder zum ersten Mal gestartet wird, ist:Verwenden Sie die get * -Funktionen genau wie die put * -Funktionen, um die Daten wieder herauszuholen. Die Daten werden als Name-Wert-Paar gespeichert. Das ist wie eine Hashmap. Sie geben einen Schlüssel und den Wert an. Wenn Sie den Wert zurückgeben möchten, geben Sie den Schlüssel an und die Funktion erhält den Wert. Hier ist ein kurzes Beispiel.
Ihre gespeicherte Nachricht wird auf den Bildschirm geröstet. Hoffe das hilft.
quelle
Ein wichtiger Hinweis, den alle neuen Android-Entwickler wissen sollten, ist, dass alle Informationen in Widgets (TextView, Schaltflächen usw.) von Android automatisch beibehalten werden, solange Sie ihnen eine ID zuweisen. Das bedeutet, dass der größte Teil des UI-Status ohne Probleme erledigt wird. Nur wenn Sie andere Daten speichern müssen, wird dies zu einem Problem.
Von Android Docs :
quelle
Eine gute Information: Sie müssen in der onCreate () -Methode nicht überprüfen, ob das Bundle-Objekt null ist. Verwenden Sie die Methode onRestoreInstanceState (), die das System nach der Methode onStart () aufruft. Das System ruft onRestoreInstanceState () nur auf, wenn ein gespeicherter Status wiederhergestellt werden muss, sodass Sie nicht überprüfen müssen, ob das Bundle null ist
quelle
Information speichern:
Wenn Sie keine Informationen in Ihrer onCreate-Methode wiederherstellen möchten:
Hier sind die Beispiele: Neuerstellung einer Aktivität
quelle
Grundsätzlich erhalten Sie mit onSaveInstanceState (Bundle outBundle) ein Bundle. Wenn Sie sich die Bundle-Klasse ansehen, werden Sie feststellen, dass Sie viele verschiedene Dinge darin ablegen können. Beim nächsten Aufruf von onCreate () erhalten Sie das Bundle nur als Argument zurück. Dann können Sie Ihre Werte erneut lesen und Ihre Aktivität wiederherstellen.
Nehmen wir an, Sie haben eine Aktivität mit einem EditText. Der Benutzer hat einen Text darin geschrieben. Danach ruft das System Ihren onSaveInstanceState () auf. Sie lesen den Text aus dem EditText und schreiben ihn über Bundle.putString ("edit_text_value", theValue) in das Bundle.
Jetzt heißt onCreate. Sie prüfen, ob das mitgelieferte Bundle nicht null ist. In diesem Fall können Sie Ihren Wert über Bundle.getString ("edit_text_value") wiederherstellen und wieder in Ihren EditText einfügen.
quelle
Dies dient der zusätzlichen Information.
Stellen Sie sich dieses Szenario vor
ActivityB startet eine neue ActivityAPrime von
ActivityAPrime hat keine Beziehung zu ActivityA.
In diesem Fall ist das Bundle in ActivityAPrime.onCreate () null.
Wenn ActivityA und ActivityAPrime dieselbe Aktivität anstelle unterschiedlicher Aktivitäten sein sollen, sollte ActivityB finish () aufrufen als startActivity ().
quelle
Wenn Daten nicht geladen werden
savedInstanceState
Verwenden Sie den folgenden Code.Das Problem ist, dass der URL-Aufruf nicht vollständig abgeschlossen werden kann. Überprüfen Sie daher, ob Daten geladen sind, und zeigen Sie den Wert instanceState an.
quelle