Android程序开发之WebView使用总结

 更新时间:2016年07月06日 09:58:38   作者:总李写代码  
这篇文章主要介绍了Android程序开发之WebView使用总结的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

前言:

今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。

使用场景:

1.)添加权限

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

2.)布局文件

<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />

3.)数据加载

加载本地资源

webView.loadUrl("file:///android_asset/example.html");

加载网络资源

webView.loadUrl("www.xxx.com/index.html");

添加请求头信息

Map<String,String> map=new HashMap<String,String>();map.put("User-Agent","Android");
webView.loadUrl("www.xxx.com/index.html",map);

也可以加载html片段

String data = " Html 数据";
webView.loadData(data, "text/html", "utf-8");

实测会发现loadData会导致中文乱码,所以一般情况使用如下代码

String data = " Html 数据";
webView.loadDataWithBaseURL(null,data, "text/html", "utf-8",null);

4.)支持JavaScript

比如项目总js触发一个native函数关闭Activity

设置支持JavaScript

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);//设置支持javascript
webView.addJavascriptInterface(new JavaScriptInterface(), "xueleapp"); JavaScriptInterface 接口定义 
public class JavaScriptInterface {
@android.webkit.JavascriptInterface
public void doTrainFinish() {
finish();
}
}

5.)设置WebViewClient 主要辅助WebView处理各种通知、请求事件

比如要实现WebView中链接在WebView内部跳转

webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});

除此之外WebViewClient更多的处理网页的地址的解析和渲染,例如

onLoadResource//加载资源时响应
  onPageStart//在加载页面时响应
  onPageFinish//在加载页面结束时响应
  onReceiveError//在加载出错时响应
  onReceivedHttpAuthRequest//获取返回信息授权请求

6.)设置WebChromeClient主要辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等

比如加载进度获取title

webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
//网页加载完成
} else {
//网页加载中
}
}
});

除了上面检测进度之外还有

  onCloseWindow//关闭WebView
  onCreateWindow() //触发创建一个新的窗口
  onJsAlert //触发弹出一个对话框
  onJsPrompt //触发弹出一个提示
  onJsConfirm//触发弹出确认提示
  onProgressChanged //加载进度
  onReceivedIcon //获取网页icon
  onReceivedTitle//获取网页title

7.)设置网页栈返回

webview会默认把浏览过去的网页进行压栈存储,所以我们有时需要实现回退到上一目录

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (webView.canGoBack()) {
webView.goBack();//返回上一浏览页面
return true;
} else {
finish();//关闭Activity
}
}
return super.onKeyDown(keyCode, event);
}

8.)WebView 缓存控制

•LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
•LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
•LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
•LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
•LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

WebSettings webSettings = webView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

9.)WebView屏幕自适应

WebSettings webSettings = webView.getSettings();
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);

10.)其他不常用设置

WebSettings webSettings = webView.getSettings();
webSettings.setSupportZoom(true); //支持缩放
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
webSettings.supportMultipleWindows(); //多窗口
webSettings.setAllowFileAccess(true); //设置可以访问文件
webSettings.setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
webSettings.setBuiltInZoomControls(true); //设置支持缩放
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片

11.)知识扩展WebViewJSBridge

虽然谷歌也提供了js与native函数互相调用的方式,但是通过addjavascriptInterface这种方式在Android 4.2以下版本存在一定的安全隐患,在Android 4.2以上也需要加@JavascriptInterface注解,否则无法调用。基于上面的原因建议学习一下

WebViewJSBridge这个比较不错的开源框架,地址:https://github.com/firewolf-ljw/WebViewJSBridge

12.)硬件加速

开启硬件加速强制使用GPU渲染,确实给app流畅度带来不小的提升,但是在使用过程中遇见webview闪烁,也有导致加载webView黑屏或者白屏

解决办法:关闭硬件加速

webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

这是把webview 中的硬件加速关闭。设置LAYER_TYPE_SOFTWARE后会把当前view转为bitmap保存。这样就不能开多个webview,否则会报out of memory。

需要在在webview中加入如下代码

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
invalidate();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

以上所述是小编给大家介绍的Android程序开发之WebView使用总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android中RecyclerView布局代替GridView实现类似支付宝的界面

    Android中RecyclerView布局代替GridView实现类似支付宝的界面

    RecyclerView比GridView来得更加强大,不仅是在分割线的绘制方面,在条目的编辑上也做得同样出色,下面就来看一下Android中RecyclerView布局代替GridView实现类似支付宝的界面的实例
    2016-06-06
  • Android ListView实现无限循环滚动

    Android ListView实现无限循环滚动

    这篇文章主要为大家详细介绍了Android ListView实现无限循环滚动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 在Android中访问WebService接口的方法

    在Android中访问WebService接口的方法

      最近公司有个项目需要从Android平台访问WebService接口,实现向发布的函数传递对象。在网上找了一些资料,发现使用ksoap2可以调用WebService传递对象。
    2013-05-05
  • Android编程之DatePicker和TimePicke简单时间监听用法分析

    Android编程之DatePicker和TimePicke简单时间监听用法分析

    这篇文章主要介绍了Android编程之DatePicker和TimePicke简单时间监听用法,结合具体实例形式分析了时间控件DatePicker和TimePicke布局与具体功能实现技巧,需要的朋友可以参考下
    2017-02-02
  • Android解析XML(PULL)展示到ListView

    Android解析XML(PULL)展示到ListView

    这篇文章主要为大家详细介绍了Android解析XML(PULL)展示到ListView的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android开发中超好用的正则表达式工具类RegexUtil完整实例

    Android开发中超好用的正则表达式工具类RegexUtil完整实例

    这篇文章主要介绍了Android开发中超好用的正则表达式工具类RegexUtil,结合完整实例形式分析了Android正则表达式常见操作技巧,包括针对证件号、银行账号、手机号、邮编等的正则判断相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Android组件content provider使用解析

    Android组件content provider使用解析

    这篇文章主要为大家详细解析了Android组件content provider的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android使用AlertDialog创建对话框

    Android使用AlertDialog创建对话框

    这篇文章主要为大家详细介绍了Android使用AlertDialog创建对话框的方法料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • kotlin中EditText赋值Type mismatch方式

    kotlin中EditText赋值Type mismatch方式

    这篇文章主要介绍了kotlin中EditText赋值Type mismatch方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 浅谈Android中AsyncTask的工作原理

    浅谈Android中AsyncTask的工作原理

    AsyncTask是Android本身提供的一种轻量级的异步任务类。它可以在线程池中执行后台任务,然后把执行的进度和最终的结果传递给主线程更新UI。本文将介绍Android中AsyncTask的工作原理。
    2021-06-06

最新评论