天天看點

記自己遇到的一些WebView坑

記自己遇到的一些WebView坑

1. 坑1

這個bug遇到的時候不是必現。

WebView加載時設定了這樣的語句會加載白頁:

例如:

webView.loadData("", "text/html", "uft-8");
//...<other code>...

webView1.loadUrl(url);
//...<other code>...
    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.iv_goback:
                if (webView.canGoBack()) {//此時此處canGoBack()有一定幾率為true 導緻傳回為白頁
                    webView.goBack();//傳回上一浏覽頁面
                } else {
                    finish();//關閉Activity
                }
         }
    }
           

我的配置代碼

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_html5_bottom_bar);
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
    mProgressBar.setMax();
}
private void requestData(String url) {

    WebSettings webSettings = webView.getSettings();
    webSettings.setDefaultTextEncodingName("utf-8");
    webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用緩存
    webView.setWebChromeClient(new MyChromeClient());
    webSettings.setBuiltInZoomControls(false); // 放大縮放按鈕
    // 如果通路的頁面中有JavaScript,則WebView必須設定支援JavaScript
    webSettings.setJavaScriptEnabled(true);
    //JS互動
    webView.addJavascriptInterface(new JsInteration(), "control");
    // 設定可以支援縮放
    webSettings.setSupportZoom(true);
    // 擴大比例的縮放
    webSettings.setUseWideViewPort(true);
    webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
    webSettings.setLoadWithOverviewMode(true);

    webView.setWebViewClient(new WebViewClient() {
        public boolean shouldOverrideUrlLoading(WebView view, String url) { // 重寫此方法表明點選網頁裡面的連結還是在目前的webview裡跳轉,不跳到浏覽器那邊
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            isShowFail = false;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (!isShowFail) { 
                customview.showLoadStateView(CustomView.STATE_NONE);
            }
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            isShowFail = true;
            customview.showLoadStateView(CustomView.STATE_ERROR);// 加載失敗時顯示的失敗界面
        }
    });
    webView.loadUrl(url);
}
//與JS互動的對象
public class JsInteration {
    @JavascriptInterface
    public void gotoGoodInfo(String id){
    //doSomething
    }
}
// 設定加載進度
public class MyChromeClient extends android.webkit.WebChromeClient {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        mProgressBar.setProgress(newProgress);
        if (newProgress == ) {
            mProgressBar.setVisibility(View.GONE);
        } else {
            mProgressBar.setVisibility(View.VISIBLE);

        }
        super.onProgressChanged(view, newProgress);
    }

    @Override
    public void onReceivedTitle(WebView view, String title) {
    //擷取加載的url的标題
        super.onReceivedTitle(view, title);

    }
}
           

陸續更新,部落格新人歡迎評論╮( ̄▽ ̄”)╭