1. 程式人生 > >Android WebView無法返回上一頁的問題。

Android WebView無法返回上一頁的問題。

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));
            }
        });
    }
}