In der WebView die Orientierung behalten

Wer die erste App mit PhoneGap entwickelt hat, dem wird eventuell aufgefallen sein, dass diese immer wieder auf den Initialzustand zurückgesetzt wird, wenn man das Handy neigt, also die Ausrichtung ändert. Das ist kein schönes Verhalten, da so eventuelle Eingaben und andere Zustände der Anwendung verloren gehen. Aber auch dafür gibt es eine einfache Lösung.

Eine Activity wird in Abhängigkeit verschiedener Ereignisse ständig erzeugt und zerstört. Zu diesen Ereignissen gehört eben auch das Ändern der Ausrichtung. Damit man den Zustand der Anwendung dadurch nicht ständig verliert, bietet Android einen Mechanismus, um ihn zu speichern und wiederherzustellen. Dazu überschreiben wir die Funktion onSaveInstanceState und passen die onCreate-Methode in der App-Activity etwas an:

 

  1. import com.phonegap.DroidGap;
  2. import android.os.Bundle;
  3.  
  4. public class App extends DroidGap {
  5.   @Override
  6.   public void onCreate(Bundle savedInstanceState) {
  7.     super.onCreate(savedInstanceState);
  8.     super.loadUrl("file:///android_asset/index.html");
  9.  
  10.     this.appView.getSettings().setJavaScriptEnabled(true);
  11.     this.appView.addJavascriptInterface(
  12.       new Console(), "console"
  13.     );
  14.   }
  15. }

In der AndroidManifest.xml teilen wir noch mit, dass sich die Activity um zum Beispiel das Ändern der Ausrichtung selbst kümmert:
Es fehlt lediglich eine zweite Activity in der AndroidManifest.xml:

  1. ...
  2. <activity android:name=".App"
  3.   android:label="@string/app_name"
  4.   android:windowSoftInputMode="adjustPan"
  5.   android:configChanges="orientation|keyboardHidden">
  6.   <intent-filter>
  7.     <action android:name="android.intent.action.MAIN" />
  8.       <category
  9.         android:name="android.intent.category.LAUNCHER"/>
  10.   </intent-filter>
  11. </activity>
  12. <activity android:name="com.phonegap.DroidGap"
  13.   android:label="@string/app_name"
  14.   android:configChanges="orientation|keyboardHidden">
  15.   <intent-filter>
  16.   </intent-filter>
  17. </activity>
  18. ...


Es wird nun also immer der Zustand der WebView gespeichert und geladen. Sollte keine Informationen zwischengespeichert worden sein, wird einfach die URL zur Startseite der Anwendung geladen.

 

Update: Der ursprüngliche Code war nicht ganz korrekt und hat zu Abstürzen geführt, wenn die Anwendung aus dem Hintergrund per onResume() geholt wird. Zu Auffrischung hier nochmal der Lifecycle einer Activity.
Um das eigentliche Problem in den Griff zu bekommen reicht eine Anpassung des Manifestst, wie es nun auch auf der PhoneGap-Homepage beschrieben wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.