Per semplificare: desidero salvare la posizione corrente (probabilmente diverse posizioni) in un file html visualizzato in una WebView al successivo ripristinarlo. Qualsiasi piccolo suggerimento sarebbe d'aiuto. :)Ottenere la posizione del documento in una WebView?
risposta
Se per "la posizione corrente" si intende un punto da qualche parte in una determinata pagina, non credo sia possibile ... almeno non puramente da Java. L'intera API WebKit esposta a Java è priva di tutto ciò che riguarda il contenuto delle pagine.
Se si ha il controllo sul contenuto della pagina, e c'è un modo per sapere queste posizioni tramite in-page Javascript, si potrebbe:
Passo # 1: Utilizzare WebView#addJavascriptInterface()
per aggiungere un oggetto con una sorta di recordPosition()
metodo , salvataggio delle informazioni dovunque sia appropriato
Passaggio 2: creare una funzione Javascript che chiami recordPosition()
sull'oggetto iniettato.
e quindi:
Passo # 3 bis: trigger che la funzione Javascript da Javascript stesso (ad esempio, sulla base di uno scatto), o
Passo 3b: Chiamare loadUrl("javascript:...");
sul WebView
, dove ...
è sostituito dal codice Javascript per attivare la funzione Javascript dal punto 2.
Il ripristino di queste posizioni dovrebbe funzionare allo stesso modo: fare eseguire JavaScript i ripristini effettivi, eventualmente attivati dal codice Java.
Si noti che non ho idea se ciò che si desidera (ottenere/impostare la posizione corrente) sia disponibile da Javascript, poiché non sono un programmatore per browser.
L'approccio che ho preso è stato il seguente:
Nel metodo onSaveInstanceState()
, calcolare quanto in basso nella pagina l'utente aveva fatto scorrere.
int contentHeight = webView.getContentHeight();
int scrollY = webView.getScrollY();
float scrollPercent = ((float) scrollY/((float) contentHeight));
Mettere da parte nel pacchetto. Quando si ripristina la pagina nel metodo di onCreate()
, attendere che la pagina termini il caricamento (in WebClient.onPageFinished()
), scorrere fino alla posizione registrata:
int contentHeight = webView.getContentHeight();
int y = (int) ((float) contentHeight * scrollPercent);
webView.scrollTo(0, y);
- Utilizzando un
float
e calcolando un rapporto funziona nel caso di lanciare tra paesaggio e ritratto. - Può funzionare in modo corretto ma non perfettamente se miscelato con l'autorizzazione di immagini.
- La scala può anche essere presa in considerazione. Tendo a memorizzare la scala in una preferenza nel metodo
onPause()
e quindi awebView.setInitialScale(scale)
prima di iniziare a caricare la pagina. - Ho trovato che l'impostazione della visualizzazione Web invisibile quando
scrollPercent > 0
sembra migliore.
Sorprendente risposta! Molte grazie. Domanda correlata: http://stackoverflow.com/questions/1091048/alternatives-to-window-scrollmaxy – yanchenko