Der Inhalt dieses Posts soll eine kleine Ergänzung zu diesem kurzen Tutorial, wie in Android Activities ihre Eigenschaften behalten können, auch wenn sie, beispielsweise durch das Drehen des Geräts, neu erzeugt werden, darstellen. Die selbe Problemstellung existiert nämlich auch für Fragments, wobei diese keine onRestoreInstanceState-Methode anbieten. Stattdessen muss in diesem Fall die onActivityCreated-Methode verwendet, die im Lifecylce aufgerufen wird, nachdem die zugehörige Activity erzeugt wurde.
Ausgehend von dem, in dem oben beschriebenen, vergangenen Post, verwendeten Beispiel, soll die Verwendung der entsprechenden Methoden zur Zustandsspeicherung von Fragments nun kurz erläutert werden. Das XML-Layout, das die Oberfläche beschreibt, bleibt dabei das selbe:
<?xml version="1.0" encoding="utf-8"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<EditText
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Der Code des Fragments würde dagegen folgendermaßen aussehen:
public class ExampleFragment extends Fragment {
EditText edit;
@Override
public View onCreateView(LayoutInflater inflater, Viewgroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main, container, false);
edit = (EditText) view.findViewById(R.id.edit);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("text", (String) text.getText());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onOnActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
edit.setText(savedInstanceState.getString("text");
}
}
}
Die onSaveInstanceState-Methode bleibt dabei exakt die selbe, während die Funktionalität zum Wiederherstellen der Werte aus dem gepeicherten Bundle in diesem Fall von der Methode onActivityCreated übernommen wird. Auch diese bekommt als Parameter das zwischengespeicherte Bundle übergeben aus dem dann der Text ausgelesen werden kann. Als Besonderheit ist jedoch zu beachten, dass unbedingt eine Null-Prüfung auf das Bundle-Objekt erfolgen muss, da dieses null ist, wenn das Fragment erzeugt wird, ohne dass zuvor die onSaveInstanceState-Methode aufgerufen worden ist (also beim erstmaligen Erzeugen des Fragments).