Android Webview总结

这些都是曾经收集到的一些关于Webview的知识,有些工作中用到了,有些暂时还没有用到,这次统一整理下,希望对自己,对大家有所帮助。另外,欢迎大家补充(当然,有错也要指正呀,不胜感激),如果可以的话,我会 更新到本帖中。

官方文档
更多知识:)

一.权限

<uses-permission android:name="android.permission.INTERNET" />

二.创建Webview对象

WebView webview = new WebView(this);

三.加载网页的方式

  • loadData(String data, String mimeType, String encoding)
    des:Load the given data into the WebView.
    as:
    String summary = "<html><body>You scored <b>192</b> points.</body></html>";
    webview.loadData(summary, "text/html", null);
  • loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
    des:Load the given data into the WebView, use the provided URL as the base URL for the content.
  • loadUrl(String url)
    des:Load the given url.
    as: webView.loadUrl("http://www.jianshu.com/"); //加载网络网页
    webView.loadUrl("file:///android_asset/html/index.html"); //加载本地assert目录下网页
    webView.loadUrl("content://com.Android.htmlfileprovider/sdcard/kris.html"); // 加载SD卡html
  • loadUrl(String url, Map<String, String> extraHeaders)
    Load the given url with the extra headers.
  • postUrl(String url, byte[] postData)
    des: Loads the URL with postData using "POST" method into this WebView.
  • 利用Intent调用系统浏览器
    Uri uri = Uri.parse("http://www.jianshu.com/");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);

四.设置Webview

webView.clearHistory();
webView.clearCache(true);
webView.clearFormData();
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);// 隐藏滚动条webView.requestFocus();
webView.requestFocusFromTouch();

五.Webview辅助类

1>WebSettings

设置WebView的一些属性、状态等,例如允许使用javascript,允许使用缓存,允许使用内置的缩放组件,设置支持IS等。

  • 官方文档
  • 获取WebSettings对象:
    WebSettings mWebSettings = webView.getSettings();
  • For Example
WebSettings mWebSettings = webView.getSettings();
mWebSettings.setJavaScriptEnabled(true);// 支持JS
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过js打开新的窗口
mWebSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);//提高渲染等级
mWebSettings.setBuiltInZoomControls(false);// 设置支持缩放
mWebSettings.setDomStorageEnabled(true);//使用localStorage则必须打开
mWebSettings.setBlockNetworkImage(true);// 首先阻塞图片,让图片不显示
mWebSettings.setBlockNetworkImage(false);//  页面加载好以后,在放开图片:
mWebSettings.setSupportMultipleWindows(false);// 设置同一个界面
mWebSettings.setBlockNetworkImage(false);
mWebSettings.setCacheMode(1);
mWebSettings.setNeedInitialFocus(false);// 禁止webview上面控件获取焦点(黄色边框)
2>WebViewClient

主要帮助WebView处理各种通知、请求事件(例如,点击链接时候如何显示界面,页面开始加载,加载完毕之后有何动作等)

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        //页面开始加载时
        super.onPageStarted(view, url, favicon);
    }
    @Override
    public void onPageFinished(WebView view, String url) {
        //页面加载结束时
        super.onPageFinished(view, url);
    }
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        super.onReceivedError(view, errorCode, description, failingUrl);
        // 这里进行无网络或错误处理,具体可以根据errorCode的值进行判断,
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        /**
         * 网页跳转:
         * 1.在当前的webview跳转到新连接
         * view.loadUrl(url);
         * 2.调用系统浏览器跳转到新网页
         * Intent i = new Intent(Intent.ACTION_VIEW);
         * i.setData(Uri.parse(url));
         * startActivity(i);
         */
        return true;
    }
});
3>WebChromeClient

辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度等

webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        // 获得网页的加载进度 newProgress为当前加载百分比
        super.onProgressChanged(view, newProgress);
    }
    @Override
    public void onReceivedTitle(WebView view, String title) {
        // 获取网页的title,客户端可以在这里动态修改页面的title
        // 另外,当加载错误时title为“找不到该网页”
        super.onReceivedTitle(view, title);
    }
});

六.与JS交互addJavascriptInterface

  • 前提
mWebView.getSettings().setJavaScriptEnabled(true);  
  • 使用
mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");  
JSInterface对象:
public class JSInterface {

    @JavascriptInterface
    public void methodA() {    }

    @JavascriptInterface
    public void methodB(String webMessage) {    }
}

注意:
1.JavascriptInterface是4.2版本google新增的一个注解,为了避免一个安全隐患,详细信息及4.2以下系统版本适配看这里: Android WebView的Js对象注入漏洞解决方案 ;另外,safe-java-js-webview-bridge这个开源项目完全用onJsPrompt() 替代了addJavaScriptInterface(),有兴趣的可以学习。
2.JS调用Java:

window.js_callback.viewPicOnJavascript($('article img').index(this));

3.客户端调用JS

mWebView.loadUrl("javascript:alert()");

七.键盘

  • webview是否可以返回到上一页面 webView.canGoBack()
  • webview返回到上一页面 webView.goBack();
  • webview是否可以前进 webView.canGoForward()
  • webview前进 webView.goForward();
public boolean onKeyDown(int keyCode, KeyEvent event) {
     if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
         mWebView.goBack();
         return true;
     }
     return super.onKeyDown(keyCode, event);
 }

八.其他

  • WebViewFragment
    好吧,之前确实不知道有这么个东东,今天写这篇贴子的时候才发现的,看名字,应该是在Fragment里对Webview的封装,应该是个好东西。有兴趣的小伙伴们 点进来:WebViewFragment
  • WebView cookies清理
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeSessionCookie();
  • 屏蔽长按事件
webView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
    }
});
  • Webiew保留缩放功能但是隐藏缩放控件(这是一招必杀技)
webView.getSettings().setSupportZoom(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setDisplayZoomControls(false);
// setDisplayZoomControls是在Android 3.0中新增的API.,调用此方法前需要对系统版本进行判断
  • 判断Webview是否滑动到顶部或底部
if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) {
    // 处于底端
}
if(webView.getScrollY() == 0){
    //处于顶部
}
des:
getScrollY() //方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
getHeight()或者getBottom() //方法都返回当前WebView这个容器的高度
getContentHeight()返回的是整个html的高度,但并不等同于当前整个页面的高度,因为WebView有缩放功能,所以当前整个页面的高度实际上应该是原始html的高度再乘上缩放比例

更多内容请关注 我的专题
转载请注明 出处:
http://www.jianshu.com/users/c1b4a5542220/latest_articles

Thank you and have a nice weekend!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容