1.前言

WebView是Android中的原生UI控件,主要用于在app应用中方便地访问远程网页或本地html资源。同时,WebView也在Android中充当Java代码和JS代码之间交互的桥梁。实际上,也可以将WebView看做一个功能最小化的浏览器。本文将全面讲解WebView各方面的知识点。

2.基本使用

创建一个WebView组件

通常情况下,我们会在XML文件中定义需要使用的UI控件,这也是官方提倡的使用方式。WebView当然也可以直接在XML中定义,但这种方式存在潜在的问题。如果在XML中定义WebView,那么系统将把当前的Activity作为Context去实例化WebView对象。由于WebView保持着对Activity的引用,如果在Activity结束时WebView还未进入销毁状态,将导致Activity无法被系统回收,进而造成内存泄漏。

因此,并不建议直接在XML文件中定义WebView,而是在需要使用WebView的时候手动创建,并将其加入合适的布局中。下面将给出一个简单的例子:

XML文件:

<?xml version="1.0" encoding="utf-8"?><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"    android:orientation="vertical">        <FrameLayout        android:id="@+id/container"        android:layout_width="match_parent"        android:layout_height="match_parent"/>LinearLayout>

我们在主布局中定义了一个FrameLayout,这将作为WebView的容器。接下来,让我们来看一下应该如何通过Java代码创建WebView并添加到这个容器中。

Java代码:

//通过代码创建FrameLayout parentLayout=findViewById(R.id.container);webView=new WebView(getApplicationContext());//使用应用级别的context,避免对Activity的引用FrameLayout.LayoutParams layoutParams=new FrameLayout.LayoutParams(        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);parentLayout.addView(webView,layoutParams);

首先,通过findViewById方法获取到之前定义在XML中的FrameLayout。然后,将ApplicationContext作为参数创建WebView对象。同时,创建FrameLayout.LayoutParams对象,这将是WebView的布局参数。最后,调用FrameLayout的addView方法,就将WebView添加到了目标位置。

需要注意:使用ApplicationContext创建WebView,WebView就不会再持有当前Activity的引用,那么前文提到的内存泄漏问题也就随之解决了。但是这种方式也是有代价的,目前已知的问题有:使用第三方应用打开网页链接异常、弹出Dialog异常、在WebView中使用Flash异常。此外,如果加载的网页中包含