2015-07-06 5 views
18

WebView offre goBack() e goForward() per l'attuazione di un comportamento tipico di back-tasto, che può essere legato a pulsanti, elementi della barra delle operazioni, o qualsiasi altra cosa:Qual è l'evento consigliato per l'aggiornamento dell'interfaccia utente di navigazione WebView?

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case R.id.back: 
     if (webView.canGoBack()) { 
      webView.goBack(); 
     } 
     break; 

     case R.id.fwd: 
     if (webView.canGoForward()) { 
      webView.goForward(); 
     } 
     break; 

     case R.id.reload: 
     webView.reload(); 
     break; 

     default: 
     return(super.onOptionsItemSelected(item)); 
    } 

    return(true); 
    } 

WebView ha anche canGoBack() e canGoForward(), a dire se queste sono vitali opzioni date la cronologia di navigazione corrente nel WebView, mostrate sopra come guardie attorno alle chiamate goBack() e goForward().

In teoria, è possibile utilizzare canGoBack() e canGoForward() per abilitare o disabilitare pulsanti, elementi della barra delle azioni o altro. Questo ti darebbe la tipica interfaccia utente del browser, in cui i pulsanti Indietro e Avanti sono disponibili solo per l'utente quando avrebbero un effetto reale.

Ciò che non è chiaro è quando dovremmo chiedere canGoBack() e canGoForward() e abilitare/disabilitare questi pulsanti. Dovrebbe essere in:

  • onPageStarted() in un'usanza WebViewClient?
  • doUpdateVisitedHistory() in una WebViewClient personalizzata?
  • in qualche altro callback?
  • una combinazione di questi?
  • ogni secondo o così semplicemente su un timer, perché non abbiamo un callback affidabile per determinare quando questi dovrebbero essere aggiornati?
+0

Sfortunatamente non vi è alcun callback diretto esposto dalle API pubbliche. Date un'occhiata alla realizzazione del Browser: https://github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/Tab.java registrano un WebBackForwardListClient al WebViewClassic a guarda le modifiche alla voce della cronologia. Questo è l'unico modo per farlo. Questa non è API pubblica. Può essere fatto volontariamente per riflessione. Ulteriori suggerimenti nel codice sono framework/base/core/java/android/webkit/CallbackProxy.java e base/core/java/android/webkit/WebBackForwardListClassic.java). –

+0

"Questo è l'unico modo per farlo" - poiché 'WebViewClassic' non verrà utilizzato sui dispositivi più recenti, c'è chiaramente un altro modo per farlo. – CommonsWare

+0

nelle versioni precedenti hanno utilizzato getWebViewClassic(). SetWebBackForwardListClient (mWebBackForwardListClient); per attaccare il loro ascoltatore. Ora guardando il codice corrente che ho collegato loro creano semplicemente WebBackForwardListClient e non fanno assolutamente nulla con esso .. sembra rotto a me –

risposta

7

La documentazione di canGoBack() attualmente state che restituisce true se

questo WebView ha una voce di storia di nuovo

canGoForward() ha un Javadoc simile.

Il problema è che non è chiaramente documentato quando la cronologia posteriore è stata modificata. Dipenderebbe interamente dall'implementazione di WebView (Client) e questo potrebbe sempre cambiare in futuro. Potrebbe anche essere diverso su vari dispositivi/versioni/forche Android.

doUpdateVisitedHistory() inoltre, non è chiaramente documentato:

notificare l'applicazione host per aggiornare il suo database di link visitati.

Il problema è che non viene indicato QUANDO viene chiamato, ma solo che è necessario aggiornare i collegamenti visitati. Potrebbe essere chiamato prima o dopo di quanto desiderato, a seconda dell'implementazione di WebView (Client).

Penso che la scelta sia tua per determinare quanto sei sicuro di voler rendere il tuo codice contro possibili guasti.

Personalmente, vorrei andare con l'aggiornamento a onPageStarted(), onPageFinished() e doUpdateVisitedHistory() perché funziona in tutte le condizioni ragionevolmente attesi e non ha il sovraccarico delle prestazioni di polling con un timer.
Quindi lo testerei su dispositivi di diverse marche e versioni di Android per vedere se si comporta come me lo aspetti.
Se non funziona ancora, si potrebbe prendere in considerazione l'implementazione di un timer/meccanismo di polling.

1

È possibile verificare utilizzando i metodi canGoBack() e canGoForward() nel callback onPageFinished. In questo modo, sai che una nuova pagina ha appena terminato il caricamento, quindi puoi verificare se la webview può andare avanti o indietro e quindi abilitare/disabilitare i tuoi pulsanti.

L'ho usato in questo modo e funziona benissimo

Problemi correlati