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'usanzaWebViewClient
?doUpdateVisitedHistory()
in unaWebViewClient
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?
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). –
"Questo è l'unico modo per farlo" - poiché 'WebViewClassic' non verrà utilizzato sui dispositivi più recenti, c'è chiaramente un altro modo per farlo. – CommonsWare
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 –