Wie kann man den Reload beim drehen des Handys in Webview verhindern?

  • Antworten:8
René A.
  • Forum-Beiträge: 4

15.12.2014, 12:58:55 via Website

Bin gerade neu in die Android App-Entwicklung eingestiegen.
Meine eigentliche App habe ich mit jQuery Mobile entwickelt und möchte diese in einer Webview App verpacken.
Soweit hat alles funktioniert.
Nur wenn ich das Handy drehe läd es die Startseite neu rein und nicht die Unterseite auf der ich mich gerade befinde.

Im Netz wird häufig erwähnt das man in der Manifest XML in der Activity folgendes eintragen soll:

android:configChanges="keyboardHidden|orientation"

Das hat leider nicht geholfen.

Was wäre den der aktuell beste Lösungsweg?
In meiner App habe ich eine Activity mit einem Webview Element.
Im Prinzip habe ich mich an dieses Tutorial gehalten:
developer.chrome.com/multidevice/webview/gettingstarted

Antworten
pepperonas
  • Forum-Beiträge: 434

15.12.2014, 13:37:22 via Website

    private void disableOrientationChangeInRunningConfig() {
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

dann in onResume:

 disableOrientationChangeInRunningConfig();

Open Source

Antworten
René A.
  • Forum-Beiträge: 4

15.12.2014, 14:00:28 via Website

Habe ich das richtig Verstanden?
Die private Funktion in die Java Datei der Activity schreiben.
Eine onResume Funktion in ebenfalls der gleichen Java Datei erstellen und den Funktionsaufruf dort machen.
Ich hatte bisher keine onResume Funktion - nur onCreate usw.

Jetzt bekomme ich folgende Fehlermeldung:

Unable to resume activity {...} android.app.SuperNotCalledException: Activity {...} did not call through to super.onResume()

Was mache ich falsch?

Antworten
pepperonas
  • Forum-Beiträge: 434

15.12.2014, 14:13:02 via Website

Jo, hast du schon richtig verstanden.

@Override
public void onResume(){
    super.onResume();
    disableOrientationChangeInRunningConfig();
}

und dann kommt der Fehler? oO

super wichtig 1
super wichtig 2
super wichtig 3

— geändert am 15.12.2014, 14:17:19

Open Source

Antworten
René A.
  • Forum-Beiträge: 4

15.12.2014, 14:25:36 via Website

Wusste nicht das ich diesen super.onResume() aufruf einbauen muss.
Jetzt funktioniert es zumindest das der Webview auf die Drehung gar nicht reagiert.
Was OK ist... vielen Dank mal dafür.
Optimal wäre es aber wenn er die Drehung mit macht und die aktuell aufgerufene Seite beibehält statt die Startseite neu rein zu laden.
PS: Die wichtigen Links zieh ich mir gleich mal rein...

Antworten
pepperonas
  • Forum-Beiträge: 434

15.12.2014, 15:52:41 via Website

Das freut mich. :)
hehe, hättest du das gleich gesagt :D Die folgende Funktion sichert deinen "Zustand" über den Layout Wechsel...

  @Override
    public void onSaveInstanceState(Bundle outState) {
                /**
                 * sichere hier die URL oder was du sonst noch sichern willst. 
                 */
                  outState.putString("deinKey", "www.google.com");
    }

nach dem OrientationChange springt dein Programm wieder in onCreate. Dort kannst du aus dem Paramter "savedInstanceState" deine Daten zurückholen.

Hier zwei simple Funktionen, die dir die Sache vielleicht gut verdeutlichen:

/**
 * Wiederhergestellt?
 */
private boolean isRestart(Bundle savedInstanceState) { return savedInstanceState != null; }


/**
 * Neu gestartet?
 */
private boolean isStartUp(Bundle savedInstanceState) { return savedInstanceState == null; }

Ruf am besten beide mal in onCreate auf und lasse dir den zurückgegebenen Wert ausgeben

Pseudocode:

onCreate(Bundle savedInstanceState) {
          [...]
          boolean isStart = isStartUp(savedInstanceState);

              if(isStart) Log.d("Fall 1:", "Activity NEU gestartet");
              else Log.d("Fall 2:","Activity REFRESH");

          String letzteUrl = "";
         // bzw: obiges URL-Beispiel 
if(!isStart)  letzteUrl = savedInstanceState.getString("deinKey", "www.defaultWebsite.com");   
}

Fazit: Wenn das Bundle (im Parameter) nicht null ist, kannst du die von dir vorher in onSavedInstanceState() abgelegten Key-Value Paare herausziehen um sie so dann in onCreate wieder für die Wiederherstellung zu nutzen.

PS: die Seiten wirklich unbedingt lesen und am besten auch in Form von Beispielen durcharbeiten. Wenn man das nicht auf dem Schirm hat, wirds ziemlich schwierig halbwegs sinnvolle Apps zu programmieren. Früher oder später wirst du es eh lernen wollen / müssen.
Aus eigener Erfahrung kann ich dir versichern, dass es besser ist diese Grundlagen früh zu verstehen ;)

— geändert am 15.12.2014, 15:58:01

Open Source

Antworten
René A.
  • Forum-Beiträge: 4

16.12.2014, 11:28:17 via Website

SUPER - hab es ein wenig modifiziert und siehe da es funktioniert.

Ich hole mir bei onSaveInstanceState über mWebview.getUrl die aktuelle URL vom Webview und speicher die zwischen.
In onCreate wird bei der Prüfung entsprechend die Standard URL geladen oder die zwischen gespeicherte.

Vielen Dank dafür...

pepperonas

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2014, 17:00:07 via Website

Hallo René,
Herzlich wilkommen hier im Forum :)
bitte setze deinen Thread noch auf beantwortet indem du im Browser über deinem ersten Post auf "Mehr"->"Beantwortet setzen" klickst.
Danke ;)

LG Pascal

— geändert am 16.12.2014, 17:00:44

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Migi Inc
  • Forum-Beiträge: 24

19.02.2016, 14:41:30 via Website

Probier mal diesen Code der hat auch bei mir geklappt
android:configChanges="orientation|keyboardHidden"
Der Bildschirm dreht sich. Ohne reload die Activity bleibt dann also ganz normal
Falls ich dir weiterhelfen konnte gib den Daumen hoch:P

— geändert am 19.02.2016, 14:43:47

Antworten