Android之webview详解(非原创)

文章大纲

1、webview基本介绍
1.什么是webview
2.为何要使用webview
3.webview基本操做javascript

2、webview高级使用
1.WebView状态
2.资源加载
3.WebView加载优化
4.数据缓存
5.Android 和 JavaScript 交互
6.网页前进与后退
7.内存管理
8.Cookie操做
9.页面监听与拦截
10.定位设置
11.常见问题处理php

3、参考文章css

 

webview基本介绍

1.什么是webview

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

2.为何要使用webview

  目前不少公司的 App 使用一个 WebView 做为网页加载, App 中的全部网页内容使用 HTML5 进行展现,这样只须要写一次 HTML5 代码,就能够在 Android 和 iOS 平台上运行,这就是所谓的跨平台 。随着 HTML5 的普及,不少 App 都会内嵌 WebView 来加载 HTML5 页面,即 原生和HTML5 共存,这就是当下最流行的「 混合开发 」。HTML5 最大的优点是迭代方便, 只须要修改服务端的 HTML5 页面,App 会同步更新,不管是作活动推广 App 仍是及时修复 Bug 都带来的极大的便利。不过 HTML5 劣势也很明显,当网速不尽如人意时候,加载速度会很慢(不知道5G出现后结果会带来什么变革),也就是HTML5 加载受限于网络,没有原生控件流畅,用户体验相对较差, 因此目前彻底使用 HTML5 开发 App 并无成为主流。java

3.webview基本操做

添加网络权限
在AndroidManifest.xml中添加如下内容android

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

新建webview_simple.xml布局web

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

在AndroidManifest.xml中注册WebViewActivity数据库

<activity android:name=".WebViewActivity"></activity> 

WebViewActivity中代码以下:api

import android.app.Activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.WebView; public class WebViewActivity extends AppCompatActivity { WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.webview_simple); webView = (WebView) findViewById(R.id.webview); //加载网页连接 webView.loadUrl("https://www.baidu.com"); } } 

主页面跳转代码以下:数组

import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class MainActivity extends AppCompatActivity { @BindView(R.id.button) Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick({R.id.button, R.id.button2}) public void onViewClicked(View view) { switch (view.getId()) { //简单webview加载 case R.id.button: startActivity(new Intent(MainActivity.this, WebViewActivity.class)); break; } } } 

运行截图以下所示:

 
 

网页弹窗

//message:alert弹出窗口中的提示信息(提示或警告信息对话框,仅一个确认按钮) //result:向网页中的Javascript代码反馈本次操做结果(result.confirm表明点击了肯定按钮,result.cancel表明点击了取消按钮) public boolean onJsAlert(WebView view, String url, String message,JsResult result) ///message:confirm弹出窗口中的提示信息(确认对话框,有确认、取消两个按钮) //result:向网页中的Javascript代码反馈本次操做结果(result.confirm表明点击了肯定按钮,result.cancel表明点击了取消按钮) public boolean onJsConfirm(WebView view, String url, String message,JsResult result) //message:prompt弹出窗口中的提示信息(输入信息对话框,有一个输入框,还有确认、取消两个按钮) //defaultValue:输入框中的默认信息 //result:向网页中的Javascript代码反馈本次操做结果(result.confirm表明点击了肯定按钮,result.cancel表明点击了取消按钮) public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result) 

下面给出一个简单的处理方案,能够做为参考:

@Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(MainActivity.this) .setTitle("JsAlert") .setMessage(message) .setPositiveButton("肯定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }) .setCancelable(false) .show(); return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(MainActivity.this) .setTitle("JsConfirm") .setMessage(message) .setPositiveButton("肯定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }) .setCancelable(false) .show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final EditText editText=new EditText(MainActivity.this); editText.setText("默认数据");//设置默认数据 new AlertDialog.Builder(MainActivity.this) .setTitle("JsPromt") .setView(editText)//为弹出窗口设置输入框 .setPositiveButton("肯定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(editText.getText().toString());//向Javascript传递输入值 } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }) .setCancelable(false) .show(); return true; } 

2、webview高级使用

1.WebView状态

//激活WebView为活跃状态,能正常执行网页的响应 webView.onResume() ; //当页面被失去焦点被切换到后台不可见状态,须要执行onPause //经过onPause动做通知内核暂停全部的动做,好比DOM的解析、plugin的执行、JavaScript执行。 webView.onPause(); //当应用程序(存在webview)被切换到后台时,这个方法不只仅针对当前的webview而是全局的全应用程序的webview //它会暂停全部webview的layout,parsing,javascripttimer。下降CPU功耗。 webView.pauseTimers() //恢复pauseTimers状态 webView.resumeTimers(); //销毁Webview //在关闭了Activity时,若是Webview的音乐或视频,还在播放。就必须销毁Webview //可是注意:webview调用destory时,webview仍绑定在Activity上 //这是因为自定义webview构建时传入了该Activity的context对象 //所以须要先从父容器中移除webview,而后再销毁webview: rootLayout.removeView(webView); webView.destroy(); 

2.资源加载

  WebView能够加载多种资源,包括本地资源和远程资源,同时也有多种用于加载资源的方法。
加载assets中的资源

  新建assets文件夹,再新建.html文件

 

在Activity中添加如下代码:

webView.loadUrl("file:///android_asset/test.html");//加载本地assets文件夹下的资源 

加载res中的资源

webView.loadUrl(``"[file:///android_res/mipmap/ic_launcher.png](file:///android_res/mipmap/ic_launcher.png)"``);//加载本地res文件夹下的图片 webView.loadUrl(``"[file:///android_res/raw/ic_launcher.png](file:///android_res/raw/ic_launcher.png)"``);//加载本地res文件夹下raw文件夹下的图片 webView.loadUrl(``"[file:///android_res/raw/test.html](file:///android_res/raw/test.html)"``);//加载本地res文件夹下raw文件夹下的html文件 

加载sdcard中的资源

webView.loadUrl(``"file:/sdcard/test.html");//加载本地sdcard下的资源 webView.loadUrl(``"[file:///sdcard/test.html](file:///sdcard/test.html)");//加载本地sdcard下的资源 webView.loadUrl(``"[content://com.android.htmlfileprovider/sdcard/test.html 

请求远程网页方式
loadData(以字符串形式加载html片断)

//data:html片断 //mimeType:数据类型,如"text/html" //encoding:数据编码,有两种可选值("base64"和其余任何值),分别表明base64编码和URL编码 public void loadData(String data, String mimeType, String encoding) 

loadUrlWithBaseURL(以字符串形式加载html片断)

//baseUrl:基础url,传入null至关于传入了"about:blank" //data:html片断 //mimeType:数据类型,如"text/html" //encoding:数据编码,有两种可选值("base64"和其余任何值),分别表明base64编码和URL编码 //historyUrl:历史url public void loadDataWithBaseURL(String baseUrl, String data,String mimeType, String encoding, String historyUrl) 

postUrl(以post请求的形式访问url)

//postData:本次post请求携带的数据,必须是application/x-www-form-urlencoded编码 //若是传入的url不是一个远程网页地址,那么最终将经过loadUrl方法加载这个url,同时postData参数会被忽略。 public void postUrl(String url, byte[] postData) 

3.WebView加载优化

设置页面自适应屏幕

webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); 

缩放功能

webSettings.setSupportZoom(true);//启用缩放功能 webSettings.setBuiltInZoomControls(true);//使用WebView内置的缩放功能 webSettings.setDisplayZoomControls(false);//隐藏屏幕中的虚拟缩放按钮 

舒适提示:setDisplayZoomControls(true)在某些系统版本中可能会致使应用出现意外崩溃。

若加载的 html 里有JS 在执行动画等操做,会形成资源浪费(CPU、电量)
在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 便可

页面加载过程优化
处理各类通知 & 请求事件

//步骤1. 定义Webview组件 Webview webview = (WebView) findViewById(R.id.webView1); //步骤2. 选择加载方式 //方式1. 加载一个网页: webView.loadUrl("http://www.google.com/"); //步骤3. 复写shouldOverrideUrlLoading()方法,使得打开网页时不调用系统浏览器, 而是在本WebView中显示 webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); 

onPageStarted()
做用:开始载入页面调用的,咱们能够设定一个loading的页面,告诉用户程序在等待网络响应。

webView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { //设定加载开始的操做 } }); 

onPageFinished()
做用:在页面加载结束时调用。咱们能够关闭loading 条,切换程序动做。

webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { //设定加载结束的操做 } }); 

onLoadResource()
做用:在加载页面资源时会调用,每个资源(好比图片)的加载都会调用一次。

webView.setWebViewClient(new WebViewClient(){ @Override public boolean onLoadResource(WebView view, String url) { //设定加载资源的操做 }}); 

onReceivedError()
做用:加载页面的服务器出现错误时(如404)调用。App里面使用webview控件的时候遇到了诸如404这类的错误的时候,若也显示浏览器里面的那种错误提示页面就显得很丑陋了,那么这个时候咱们的app就须要加载一个本地的错误提示页面,即webview如何加载一个本地的页面

//步骤1:写一个html文件(error_handle.html),用于出错时展现给用户看的提示页面 //步骤2:将该html文件放置到代码根目录的assets文件夹下 //步骤3:复写WebViewClient的onRecievedError方法 //该方法传回了错误码,根据错误类型能够进行不一样的错误分类处理 webView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){ switch(errorCode) { case HttpStatus.SC_NOT_FOUND: view.loadUrl("file:///android_assets/error_handle.html"); break; } } }); 

onReceivedSslError()
做用:处理https请求,webView默认是不处理https请求的,页面显示空白,须要进行以下设置:

webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); //表示等待证书响应 // handler.cancel(); //表示挂起链接,为默认方式 // handler.handleMessage(null); //可作其余处理 } }); 

4.数据缓存

当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹
请求的 URL记录保存在 WebViewCache.db,而 URL的内容是保存在 WebViewCache 文件夹下,设置是否启动缓存方法以下:

WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
      缓存模式以下:
       // LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 // LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。 // LOAD_NO_CACHE: 不使用缓存,只从网络获取数据. // LOAD_CACHE_ELSE_NETWORK,只要本地有,不管是否过时,或者no-cache,都使用缓存中的数据。 //WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);不使用缓存 

结合使用(离线加载)

if (NetStatusUtil.isConnected(getApplicationContext())) { webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。 } else { webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网,则从本地获取,即离线加载 } webSettings.setDomStorageEnabled(true); // 开启 DOM storage API 功能 webSettings.setDatabaseEnabled(true); //开启 database storage API 功能 webSettings.setAppCacheEnabled(true);//开启 Application Caches 功能 String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME; webSettings.setAppCachePath(cacheDirPath); //设置 Application Caches 缓存目录 //注意: 每一个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize() 

清理缓存

//清除网页访问留下的缓存 //因为内核缓存是全局的所以这个方法不只仅针对webview而是针对整个应用程序. webView.clearCache(true); //清除当前webview访问的历史记录 //只会webview访问历史记录里的全部记录除了当前访问记录 webView.clearHistory(); //这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据 webView.clearFormData(); 另一种方式: //删除缓存文件夹 File file = CacheManager.getCacheFileBaseDir(); if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete(); } file.delete(); } //删除缓存数据库 context.deleteDatabase("webview.db"); context.deleteDatabase("webviewCache.db"); 

5.Android 和 JavaScript 交互

安卓代码

WebSettings settings = mWebView.getSettings();
  settings.setJavaScriptEnabled(true);//开启JavaScript mWebView.loadUrl("file:///android_asset/keithxiaoy.html");//加载本地网页 mWebView.setWebChromeClient(new WebChromeClient());//此行代码能够保证JavaScript的Alert弹窗正常弹出 //核心方法, 用于处理JavaScript被执行后的回调 mWebView.addJavascriptInterface(new JsCallback() { @JavascriptInterface//注意:此处必定要加该注解,不然在4.1+系统上运行失败 @Override public void onJsCallback() { System.out.println("JavaScript调用Android啦"); } }, "keithxiaoy");//参1是回调接口的实现;参2是JavaScript回调对象的名称 //定义回调接口 public interface JsCallback { public void onJsCallback(); } 

Android 调用 JavaScript

//直接使用webview加载js就能够了 mWebView.loadUrl("javascript:wave()"); 

html代码以下

<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <script language="javascript"> /* This function is invoked by the activity */ function wave() { alert("Android调用JavaScript"); } </script> <body> <!-- JavaScript调用Android代码 --> <a onClick="window.demo.onJsCallback()"><div style="width:80px; margin:0px auto; padding:10px; text-align:center; border:2px solid #202020;" > ![](android_normal.png)<br> Click me! </div></a> </body> </html> 

注意:
  JavaScript 回调的方法的书写格式: onClick="window.demo.onJsCallback()格式是: Windows.js 回调对象的名称(要和 Java 代码中设置的一致)。回调方法名称(要和 Java 代码中设置的一致)
  JavaScript 调用 Android 的方式具备版本兼容问题。经测试,在 2.二、4.0+ 系统上运行稳定,能够正常调用,可是在 2.3 系统上运行时出现崩溃。缘由是底层进行 JNI 调用时,把一个 Java 中的 String 对象当数组来访问了,最终致使虚拟机崩溃。基本算是一个比较严重的 Bug,没办法解决。因此若是说用 WebView 组件想在 JavaScript 和 Java 互调就没办法适配全部机型。

6.网页前进与后退

在安卓手机中,Back 键控制网页后退,会关闭整个webview,解决方法是在当前 Activity 中处理获取Back键,改形成网络的返回上一步

webView.goBack();//跳到上个页面 webView.goForward();//跳到下个页面 webView.canGoBack();//是否能够跳到上一页(若是返回false,说明已是第一页) webView.canGoForward();//是否能够跳到下一页(若是返回false,说明已是最后一页) 

7.内存管理

  直接 new WebView 并传入 application context 代替在 XML 里面声明以防止 activity 引用被滥用,能解决90+%的 WebView 内存泄漏。

vWeb =  new WebView(getContext().getApplicationContext()); container.addView(vWeb); 

销毁 WebView

if (vWeb != null) { vWeb.setWebViewClient(null); vWeb.setWebChromeClient(null); vWeb.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); vWeb.clearHistory(); ((ViewGroup) vWeb.getParent()).removeView(vWeb); vWeb.destroy(); vWeb = null; } 

8.Cookie操做
Cookie 设置

CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); String cookie = "name=xxx;age=18"; cookieManager.setCookie(URL, cookie); CookieSyncManager.getInstance().sync(); 

获取 Cookie

CookieManager cookieManager = CookieManager.getInstance();
  String cookie = cookieManager.getCookie(URL); 

清除 Cookie

CookieSyncManager.createInstance(context);  
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();

9.页面监听与拦截

监听网页加载进度

public void onProgressChanged(WebView view, int newProgress) 

  onProgressChanged会在网页加载过程当中屡次触发。当newProgress的值为100时,能够认为当前网页已经加载完毕。所以,经过这个方法判断页面是否加载完成比使用上文提到的onPageFinished方法更准确。同时,因为这个方法在回调中会不断得到最新的加载进度,所以咱们能够借助这个方法实现自定义的加载进度条。
  这里给出一个简单的思路:在WebView的上方添加一个ProgressBar控件,并默认隐藏。在onPageStarted方法中显示ProgressBar,并在onProgressChanged方法回调时更新ProgressBar的进度值。当onProgressChanged方法中的newProgress达到100时,就隐藏这个ProgressBar。须要注意,为了在页面加载出错时也能正确隐藏进度条,也应该在onReceivedError方法中隐藏ProgressBar。

10.定位设置

webSettings.setGeolocationEnabled(true);//容许网页执行定位操做 

若是要禁用网页的定位功能,传入false做为参数便可。须要注意,这个方法只是容许网页执行定位操做,可是最终定位操做的实现仍是会委托给Android应用处理。所以,为了保证定位功能正常执行,须要知足如下两点:
Android应用须要获取定位权限。须要在AndroidManifest文件中声明android.Manifest.permission.ACCESS_COARSE_LOCATION和android.Manifest.permission.ACCESS_FINE_LOCATION两个权限。 须要为WebView设置WebChromeClient,并重写WebChromeClient的onGeolocationPermissionsShowPrompt方法。这个方法会在网页中的Javascript代码执行定位操做时触发。须要注意,Android6.0及以上引入了运行时权限的概念。定位属于危险权限,须要在使用时手动获取。所以咱们能够在这个回调方法中弹出一个请求定位的提示对话框(AlertDialog),在用户选择肯定后得到相应权限。

11.常见问题处理

loadData加载中文数据出现乱码
  问题描述:使用loadData方法加载含有中文的数据时,中文显示为乱码。
  解决方案:使用loadDataWithBaseURL方法代替loadData加载数据,不会出现乱码问题。 为loadData的mimeType参数传入“text/html;charset=UTF-8”,也能够解决乱码问题。

密码明文存储问题
  问题描述:在Android 4.3(API 18)之前,用户在WebView加载的网页中输入密码后,系统会弹出对话框询问用户是否须要保存密码。若是用户选择保存,那么密码将会以明文的形式保存在本地,显然这是一个巨大的安全隐患。
  解决方案:WebView是否保存密码是由WebSettings的setSavePassword方法决定的。所以,咱们只要调用这个方法并传入false,就能够避免明文储存的安全问题了。在Android 4.3及以上的版本,setSavePassword方法已经被弃用,WebView也不会默认保存密码,所以再也不须要进行修复。

WeView出现OOM影响主进程
  问题描述:因为WebView默认运行在应用进程中,若是WebView加载的数据过大(例如加载大图片),就可能致使OOM问题,从而影响应用主进程。
  解决方案:为了不WebView影响主进程,能够尝试将WebView所在的Activity运行在独立进程中。这样即便WebView出现了OOM问题,应用主进程也不会受到影响。具体作法也很简单,只要在AndroidManifest文件中为相应的Activity设置process属性便可。

WebView后台耗电问题
  问题描述:在某些状况下,即便Activity已经退出,WebView依旧占据着内存空间,这会致使设备耗电量增长。
  解决方案:在上文提到过将WebView运行在独立进程中,而后只要在Activity的onDestroy方法中调用System.exit(0)退出虚拟机,就能够避免WebView继续占据内存空间.

视频或音频在退出Activity后继续播放的问题
  问题描述:在WebView加载的网页中播放音乐或视频,然而当前应用进入后台后音乐或视频还在继续播放。
  解决方案:在Activity的onPause方法中暂停WebView,而后在onResume方法中恢复WebView。

protected void onPause() { if(webView!=null){//暂停WebView webView.onPause(); webView.pauseTimers(); } super.onPause(); } @Override protected void onResume() { if(webView!=null){//恢复WebView webView.onResume(); webView.resumeTimers(); } super.onResume(); } &emsp;&emsp; 

开启硬件加速致使的闪烁问题
  问题描述:在应用开启硬件加速后,WebView可能在加载过程出现闪烁现象。
  解决方案:为WebView关闭硬件加速功能。

webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null); 

https请求失败的解决方案
  问题描述:在使用WebView加载https协议的网页或资源时,若是该网站的安全证书不被Android承认,就会出现没法成功加载的问题。
  解决方案:重写WebViewClient的onReceivedSslError方法,设置其接受全部网站的安全证书。

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed();//接受全部网站证书 } 

WebView中http和https混合使用的问题
  问题描述:在Android 5.0及以上,WebView可能在加载混合使用http和https的网页时出现异常。好比在一个https的安全网页中加载使用http协议的资源将会失败。
  解决方案:在Android 5.0后利用WebSettings设置WebView支持http和https混合内容模式。

//方式1 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); //方式2 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); 

  须要注意,MIXED_CONTENT_ALWAYS_ALLOW这个模式是不安全的,建议先使用MIXED_CONTENT_COMPATIBILITY_MODE模式。这个模式会尝试以安全的方式加载部分http资源,另外一部分http资源则不会被加载。资源是否能被加载的判断依据可能会随着版本的不一样而改变,所以须要根据实际状况决定是否采用这一模式。

setDisplayZoomControls引发的崩溃问题
  问题描述:咱们知道,setDisplayZoomControls(true)方法会容许显示系统缩放按钮,这个缩放按钮会在每次出现后的几秒内逐渐消失。可是在部分系统版本中,若是在缩放按钮消失前退出了Activity,就可能引发应用崩溃。
  解决方案:调用setDisplayZoomControls(false)方法不显示系统缩放按钮,反正使用手势捏合动做就能够实现网页的缩放功能了。若是确实须要使用缩放按钮,就须要在Activity的onDestroy方法中隐藏WebView。

webView.setVisibility(View.GONE); 

3、参考文章

  1. https://www.jianshu.com/p/4564be81a108
  2. https://www.jianshu.com/p/daf6d72268a4
  3. https://www.2cto.com/kf/201712/706339.html
相关文章
相关标签/搜索