20. Februar 2013

Android: Die Fragment-Methoden onSaveInstanceState und onActivityCreated

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. 

Der Fragment-Lifecycle (Bildquelle: www.developer.android.com, Klicken zum Vergrößern)

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).

2 Kommentare:

  1. Die onCreateView Methode kann nicht vom Typ void sein, da ja ein View als return-Wert übergeben wird. Weiters muss es in diesem Beispiel "view.findViewById.." heißen, sonst funktioniert es nicht.

    Ansonsten super, hat mir trotzdem weitergeholfen danke

    AntwortenLöschen
  2. Vielen Dank für den Hinweis! Die beiden fehlerhaften Stellen wurden ausgebessert. Es freut mich, wenn das Beispiel helfen konnte.

    AntwortenLöschen