Android学习笔记:WebView

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/MaybeForever/article/details/96431439

项目地址:https://github.com/ambition-hb/WebViewDemo


一、WebView控件基本属性的设置

方法 说明
WebView.getSettings().setJavaScriptEnable(boolean enabled) 表示是否支持js,若想让Java与js能够交互,可以设置为true
WebView.getSettings().setSupportZoom(boolean enabled) 表示是否支持缩放,默认为true
WebView.getSettings().setBuiltInZoomControls(boolean enabled) 设置是否显示缩放工具,默认为false
WebView.getSettings().setDefaultFontSize(int size) 设置默认的字体大小,默认为16,有效区间为1~72
WebView.getSettings().setLayoutAlgorithm(LayoutoAlgorithm.SINGLE_COLUMN) 设置网页内容重新布局的模式,用于设置网页自适应屏幕的规则

二、WebView的基础用法

新建一个WebView项目,然后修改activity_main.xml布局文件中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.haobi.webviewdemo.MainActivity">

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

</LinearLayout>

然后,修改MainActivity中的代码,如下所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1、使用findViewById()方法获取到WebView的实例
        WebView webView = (WebView)findViewById(R.id.web_view);
        //2、调用WebView的getSettings()方法去设置一些浏览器的属性
        //setJavaScriptEnabled()方法用于设置是否执行页面的js方法
        webView.getSettings().setJavaScriptEnabled(true);
        //3、调用WenView的setWebViewClient()方法并传入一个WebViewClient的实例
        //作用在于网页跳转的时候,目标页面仍在当前WebView中显示,而不是打开系统浏览器
        webView.setWebViewClient(new WebViewClient());
        //4、调用WebView的loadUrl()方法并将网址传入
        webView.loadUrl("http://www.baidu.com");
    }
}

最后,在AndroidManifest.xml文件中加入网络请求权限。

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

三、WebView使用进阶

1、WebViewClient

WebViewClient是WebView的一个辅助类,我们经常使用WebViewClient这个类来监控webview加载网页的状态

下面的是我们在开发中经常会使用的方法。

  • onLoadResource

    网页加载网页各种资源的回调,比如你的网页使用了各种图片和css文件与js文件

  • onPageStarted

    网页开始加载的回调

  • onPageFinished

    网页加载完成的回调

  • onReceivedError(WebView view, int errorCode, String description, String failingUrl)

    网页加载失败的回调,如果是运行在6.0的手机,需要onReceivedError(WebView, WebResourceRequest, WebResourceError)

  • shouldOverrideUrlLoading

    处理网页内部的跳转

2、WebChromeClient

我们经常使用WebChromeClient这个类来处理js交互与网页内容的类

  • onJsAlert

    接收网页的alert事件

  • onJsPrompt

    接收网页的prompt输入框事件

  • onJsConfirm

    接收网页的confirm确认事件

  • onProgressChanged

    页面加载的百分比

  • onReceivedIcon

    接收网页的图标

  • onReceivedTitle

    接收网页的标题

3、WebSettings

WebSettings是WebView的设置类,能够设置webview的各种详细参数

  • setAllowFileAccess(boolean allow)

    设置是否使用file协议访问网页,常用于访问assets与raw文件夹下面的网页

  • setBuiltInZoomControls(boolean enabled)

    设置是否使用webview自带的缩放功能

  • setDatabaseEnabled(boolean flag)

  • setDomStorageEnabled(boolean flag);

    设置是够支持html5的数据库功能

  • setDefaultFontSize(int size)

    设置页面的文字大小

  • setJavaScriptEnabled(boolean flag)

    设置是否执行页面的js方法

  • setCacheMode

    设置返回键的处理,是否使用缓存加载页面,LOAD_DEFAULT(先从cache加载,没有再去网络加载), LOAD_CACHE_ELSE_NETWORK(先从cache加载,没有再去网络加载), LOAD_NO_CACHE(不使用cache) , LOAD_CACHE_ONLY(只使用cache)

4、WebView

android提供的控件,能够加载网页和html数据。

  • addJavascriptInterface(Object object, String name)

    增加一个对象使webview能够让java代码与js交互

  • loadUrl(String url)

    加载一个网页,能够是网络的网页,也能加载本地的网页,本地的网页使用(file:///assets/)来加载。也可以调用一个javaScrpit方法。

  • loadData(String data, String mimeType, String encoding)

  • loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)

    加载一段html代码

  • reload()

    刷新当前页面

  • getTitle()

    获取当前页面的标题

  • canGoBack()

  • goBack()

    判断webview是否能够回到上一步

5、使用WebView需要注意的问题

1、在android 4.2版本以下的手机有一个问题就是,webview会被JavaScript注入,造成手机出现信息安全的问题,比如下载病毒,发送短信等等。问题就出在addJavascriptInterface方法。JavaScript通过调用这个接口可以直接操作本地的JAVA接口。

2、google在4.2的版本上面解决了这个问题,解决的方法是在被js调用的方法上面加上一个声明, @JavascriptInterface,但是4.2版本以下的手机就没有提出官方的解决方法。目前来说在4.2版本以下的手机能够采用以下几个方法来解决安全问题

  • 1 通过自定义url来进行通信,我们可以重写 shouldOverrideUrlLoading 方法来接收参数
  • 2 通过js通过prompt方法传递参数到 onJsPrompt

四、HTML5与Java交互的五种方式

  • 1 onJsAlert->JavaScript->alter
  • 2 onJsPrompt ->JavaScript->prompt->java返回一个参数给js
  • 3 onJsConfirm ->JavaScript->Confirm->java返回一个参数给js
  • 4 addJavascriptInterface->(由于该方法容易触发注入,我们引入注解,只适合4.2以上版本)->@JavascriptInterface
  • 5 url跳转->shouldOverrideUrlLoading->根据url进行处理(4.2以下版本适应)

猜你喜欢

转载自blog.csdn.net/MaybeForever/article/details/96431439