Android WebView; OnTouchListener

  • Antworten:11
Florian A.
  • Forum-Beiträge: 7

14.12.2012, 14:52:52 via Website

Hallo,

ich programmiere gerade eine Browser App. Ich habe also eine Activity in der eine WebView eingebaut ist.
Mein Ziel ist es, dass bei sämtlichen Touches innerhalb des WebView ein Variable vom Typ Integer zurückgesetzt wird.
Bisher sieht das so aus:

webView.setOnTouchListener(new OnTouchListener(){


public boolean onTouch(View v, MotionEvent event){

counter_refresh = 0;

return true;
}});

Jetzt kann ich allerdings keine Aktionen mehr auf der angezeigten WebView durchführen.

Vielleicht gibt es auch eine viel bessere Lösung für mein Problem. Ich will einen automatischen Refresh der Website in die App integrieren. Das funktioniert auch so weit mit Hilfe eines Timers.
Jetzt will ich aber, dass sobald irgendeine Aktion auf dem Bildschirm durchgeführt wird der Timer zurückgesetzt wird. So will ich verhindern, dass einem User während einer Aktion die Seite neugeladen wird und er neu beginnen muss. Findet keine Aktion statt soll aber ein automatischer Refresh ausgeführt.

Kann mir hier jemand weiterhelfen?

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

14.12.2012, 15:46:01 via Website

Doku:
---
Returns
True if the listener has consumed the event, false otherwise.
---
Demnach sollte die Lösung für dein Problem darin bestehen, statt true eben false zurück zu geben.

Florian A.

Antworten
Florian A.
  • Forum-Beiträge: 7

17.12.2012, 10:06:51 via Website

Tja, wer lesen kann ist klar im Vorteil.
Danke für den Hinweis. Jetzt funktionierts.

San Blarnoi

Antworten
Florian A.
  • Forum-Beiträge: 7

17.12.2012, 10:36:20 via Website

Jetzt hab ich noch folgendes Problem:

Es soll möglich sein nach dem der Homebutton des Gerätes gedrückt und somit die App verlassen wurde, zu einem späteren Zeitpunkt an der Stelle fortzufahren wo die App als letztes war (State). Das funktioniert bei mir manchmal und manchmal nicht. Keine Ahnung warum.
Wie kann ich das lösen?

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

17.12.2012, 10:53:34 via Website

Was hast du denn dazu schon probiert?
Es geht darum, beim erneuten Aufruf die zuletzt angezeigte Website wieder zu öffnen?

Antworten
Florian A.
  • Forum-Beiträge: 7

17.12.2012, 11:06:51 via Website

Nicht öffnen sondern so anzuzeigen wie die Seite zuletzt geöffnet wurde.
Außerdem habe ich eine zweite Activity in welcher die Einstellungen des 'Browser' vorgenommen werden können.
Drücke ich auf den Homebutton und kehre später in die App zurück soll ja auch die zuletzt geöffnete Activity angezeigt werden.
Und wie gesagt das funktioniert manchmal und ich kann mir nicht erklären warum bzw. von was das abhängig sein kann ob es funktioniert oder nicht.

In der Manifest habe ich diese Einstellung gesetzt:

android:alwaysRetainTaskState="true"

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

17.12.2012, 12:01:12 via Website

Nicht öffnen sondern so anzuzeigen wie die Seite zuletzt geöffnet wurde.
Wenn deine App neu gestartet wird, dann "öffnet" sie also keine Website? Die entsteht aus dem nichts? Oder wie meinst du das?

Drücke ich auf den Homebutton und kehre später in die App zurück soll ja auch die zuletzt geöffnete Activity angezeigt werden.
Mir ist nicht bekannt, das es für sowas irgendwelche Automatismen gibt;
du wirst dir also alle wichtigen Parameter (welche Activity, welche Seite, evtl. History, ggf Scrollposition etc) irgendwo speichern und beim Start wiederherstellen müssen.

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

17.12.2012, 12:17:32 via Website

Die Activity öffnet sich ja wieder mit ihren Start-indent. Das regelt Android ja automatisch!
Gibt es eigentlich die Möglichkeit in OnPause() diesen Start-indent bzw. dessen Bundle zu verändern.
Somit hätte man automatisch eine Zustandsspeicherung.

— geändert am 17.12.2012, 12:18:06

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

17.12.2012, 12:25:51 via Website

Florian A.
Jetzt hab ich noch folgendes Problem:

Es soll möglich sein nach dem der Homebutton des Gerätes gedrückt und somit die App verlassen wurde, zu einem späteren Zeitpunkt an der Stelle fortzufahren wo die App als letztes war (State). Das funktioniert bei mir manchmal und manchmal nicht. Keine Ahnung warum.
Wie kann ich das lösen?

Falls die Activity nicht zerstört wurde klappt es.
Wenn du z.B. zwischenzeitlich eine andere App startes wird i.a. deine Activity zerstört.
Beim Wiederöffnen der App wird sie wieder mit den Startparameter geöffnet.

Antworten
Florian A.
  • Forum-Beiträge: 7

18.12.2012, 15:54:08 via Website

Na gut da muss mich noch genauer mit beschäftigen aber das ist erstmal zweitrangig.

Viel wichtiger wäre noch folgendes Problem: Die WebView in meiner Activity soll nicht neugeladen werden bei drehen des Gerätes. Dafür gibts es ja den Eintrag android:configChanges = "orientation". Dann habe ich jeweils eine layout-port.xml und layout-land.xml erstellt. Das funktionierte bisher wunderbar. Bei der jetzigen App ist mein minSdk 14 d.h wie unten angeführt muss ich mit ScreenSize arbeiten, sonst ist das ganze wieder hinfällig.

android:configChanges:orientation
The screen orientation has changed — the user has rotated the device.

Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.

Setze ich aber den Eintrag ScreenSize wechselt mir die Activity nicht mehr die layout-xml's d.h. es wird eben verzerrt dargestellt. Starte ich die App in der anderen Ausrichtung wird die richtige layout-xml geladen nur während der Laufzeit nicht. Ich habe auch schon die XML's in layout-xlarge-land bzw. port geändert aber das bringt nix.
Was muss da noch beachtet werden? Habe ich da irgendwas übersehen?

— geändert am 18.12.2012, 15:54:41

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

18.12.2012, 19:13:47 via Website

Wenn du verschiedene Layouts verwendest, dann ist die "android:configChanges" Methode unbrauchbar.

Stattdessen:
im onCreate():
if (savedInstanceState != null) {
web.restoreState(savedInstanceState);
}
else {
// normales Laden der Startseite
}

Außerdem:
protected void onSaveInstanceState(Bundle outState) {
web.saveState(outState);
}

Antworten
Florian A.
  • Forum-Beiträge: 7

20.12.2012, 09:04:12 via Website

Gut habs jetzt gelöst. Zwar etwas anders aber es läuft jetzt soweit. Danke für die Hilfe.

Jetzt fehlt mir nur noch ein Punkt auf dem Weg zur vollständigen App. Ich habe eine Activity in der sämtliche Einstellungen zur App gesetzt werden können. Da will ich einen Switch integrieren mit dem ich die Rotation der App ausschalten kann.
Hättet ihr da einen Tipp für mich wie ich das mache?
Also das mit dem Switch und wie ich dessen Status abfrage ist klar, nur die Funktion zum Ausschalten der Rotation ist noch etwas unklar.

— geändert am 20.12.2012, 09:04:37

Antworten