Android WebView無法返回上一頁的問題。
阿新 • • 發佈:2019-01-28
private int androidVersion;//系統版本 private int listSize;//歷史長度 private int historyPostion;//歷史索引位置 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...) WebView webview = findViewById...; WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//支援js webSettings.setDomStorageEnabled(true);//支援DOM API if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //設定當一個安全站點企圖載入來自一個不安全站點資源時WebView的行為, //在這種模式下,WebView將允許一個安全的起源從其他來源載入內容,即使那是不安全的. //如果app需要安全性比較高,不應該設定此模式 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//解決app中部分頁面非https導致的問題 } webView.setWebViewClient(new WebViewClient() { @Override public void onFormResubmission(WebView view, Message dontResend, Message resend) { resend.sendToTarget(); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub // return false;//可以解決由於重定向導致的webview.goback()無法返回的問題 if (androidVersion == 22) {//安卓5.1webview.goback()無法正常返回。 WebBackForwardList list = webView.copyBackForwardList();//webView佇列 listSize = list.getSize(); historyPostion = listSize; } view.loadUrl(url); return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Log.e(TAG, "onReceivedSslError"); handler.proceed();// 接受所有網站的證書 //super.onReceivedSslError(view, handler, error); } }); webView.addJavascriptInterface(new JsObject(webView), "history");//重寫了webview中的js方法 } @Override public boolean onKeyDown(int keyCode, KeyEvent keyEvent) { if (keyCode == keyEvent.KEYCODE_BACK) {//監聽返回鍵,如果可以後退就後退 if (webView.canGoBack()) { if (androidVersion == 22) {//部分android5.1 webview存在問題,需要自己查詢歷史記錄並loadUrl WebBackForwardList list = webView.copyBackForwardList(); historyPostion--; String url = list.getItemAtIndex(historyPostion).getUrl(); webView.loadUrl(url); } else { webView.goBack(); } return true; } } return super.onKeyDown(keyCode, keyEvent); } class JsObject { private static final String TAG ="JsObject" ; private WebView JsObjectwebView; public JsObject(WebView webView) { JsObjectwebView = webView; } @JavascriptInterface public void back() { JsObjectwebView.post(new Runnable() { @Override public void run() { Log.i(TAG, "goBack:"); JsObjectwebView.goBack(); } }); } @JavascriptInterface public void forward() { Log.i(TAG, "forward:"); JsObjectwebView.post(new Runnable() { @Override public void run() { JsObjectwebView.goForward(); } }); } @JavascriptInterface public void go(final String i) { JsObjectwebView.post(new Runnable() { @Override public void run() { JsObjectwebView.goBackOrForward(Integer.parseInt(i)); } }); } }