WebView详解(二)

源码地址
与WebView相关的三个类,WebSettings, WebViewClient, WebChromeClient。类中的方法作用参见WebView详解(一)

三、WebView复杂的使用

1、进度条

在WebChromeClient里有onProgressChanged方法,利用此方法可以实现进度条。

(1)布局



    

    

(2)重写WebChromeClient中的onProgressChanged方法

mWebView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress == 100) {
            // 网页加载完成
            mProgressBar.setVisibility(View.GONE);
        } else {
            // 加载中
            mProgressBar.setVisibility(View.VISIBLE);
            mProgressBar.setProgress(newProgress);
        }
    }
});

2、在当前WebView中打开新连接,不跳转到系统浏览器

重写WebViewClient的shouldOverrideUrlLoading方法

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(你想在当前页面打开新连接){
            view.loadUrl(url);
        }else if(在一个新的activity中打开新连接){
            Intent intent = new Intent(mContext, NewWebViewActivity.class);
            intent.putputExtra("URL", url);
            startActivity(intent);
        }
        return true;
    }
});

在API 21中 shouldOverrideUrlLoading(WebView view, String url)被废弃,改为shouldOverrideUrlLoading(WebView view, WebResourceRequest request),我们可以通过request.getUrl()来获取url。

@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

3、back键返回访问历史

mWebView.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View view, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
                mWebView.goBack();
                return true;
            }
        }
        return false;
    }
});

4、返回时剔除相同页面

同样是重写WebViewClient.shouldOverrideUrlLoading方法。其中url是要加载的新路径,originalUrl是原路径。

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (!url.equals(originalUrl)) {
            loadUrl(url, view);
        } else {
            //页面相同,清楚此路径的历史记录。
             view.clearHistory();
        }
        return true;
    }
});

如果重写了WebViewClient的shouldOverrideUrlLoading方法,在当前页面加载新页面。ajax请求过后,重新

5、加载web url,插入本地js

在assets文件夹新建一个alert.js。只有一个方法,接受一个mseesage,并将message弹出。

function aliert(message) {
    alert(message)
}

在onPageFinished方法回调的时候,将此js插入到WebView中。此处有坑,尝试了网上的各种方法,均不能成功,最后在stackoverflow上找到方法。

wvContent.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        injectScriptFile(view, "alert.js");
    }

    //ref http://stackoverflow.com/questions/21552912/android-web-view-inject-local-javascript-file-to-remote-webpage
    private void injectScriptFile(WebView view, String scriptFile) {
        InputStream input;
        try {
            input = getAssets().open(scriptFile);
            byte[] buffer = new byte[input.available()];
            input.read(buffer);
            input.close();
            String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
            view.loadUrl("javascript:(function() {" +
                    "var parent = document.getElementsByTagName('head').item(0);" +
                    "var script = document.createElement('script');" +
                    "script.type = 'text/javascript';" +
                    // Tell the browser to BASE64-decode the string into your script !!!
                    "script.innerHTML = window.atob('" + encoded + "');" +
                    "parent.appendChild(script)" +
                    "})()");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

接下来就和用原生调用js一样了。

6、Cookie

和Cookie相关的两个类CookieSyncManager, CookieManager。CookieSyncManager在21的被废弃,因为Cookie可以自动同步了。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    CookieSyncManager.createInstance(mContext);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    cookieManager.removeSessionCookies(null);
    cookieManager.removeAllCookies(null);
} else {
    cookieManager.removeSessionCookie();
    cookieManager.removeAllCookie();
}
cookieManager.setCookie("URL", "Cookie的value");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    cookieManager.flush();
} else {
    CookieSyncManager.getInstance().sync();
}

7、一个完整的

你可能感兴趣的:(WebView详解(二))