【Android】webview常用方法和使用

文章目录

  • 前言
  • 一、常见用法
  • 二、基础属性
    • webView的常用方法
    • WebViewClient的常用方法
    • WebChromeClient的常用方法
    • WebSettings的相关方法
  • 三、加载流程和事件回调
  • 四、webview和JS之间的互相调用
    • 总结
  • 五、参考链接


前言

最近项目又用到了webview,在回顾复习一次webview相关的知识,顺手整理下。

webview是一个基于webkit引擎、展现web页面的控件(4.4以下使用webkit引擎,4.4以后使用chrome内核),在Android开发中常用于展示网页和执行JavaScript。

一、常见用法

webview展示网页需要联网,网络权限需要配置,以下为常用的实现的案例

 		mWebview = findViewById(R.id.wb);// 校验网络if (!NetworkUtil.getInstance(this).isNetworkAvailable()) {return;}// 允许JS调用mWebview.getSettings().setJavaScriptEnabled(true);// 解决白边问题mWebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);mWebview.loadUrl(“url”);mWebview.setWebViewClient(new WebViewClient(){@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);}@Overridepublic void onLoadResource(WebView view, String url) {super.onLoadResource(view, url);}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {super.onReceivedError(view, request, error);}});

注意webview内存泄露,及时释放资源

protected void onDestroy() {if (mWebview != null) {mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);mWebview.clearHistory();((ViewGroup) mWebview.getParent()).removeView(mWebview);mWebview.destroy();mWebview = null;}super.onDestroy();Log.d(TAG, "onDestroy ...");}

二、基础属性

以下是webview中相关设置的常用方法介绍

webView的常用方法

// 恢复pauseTimers状态
1.web_view.resumeTimers();
// 它会暂停所有webview的布局显示、解析、延时,从而降低CPU功耗
2.web_view.pauseTimers();
// 激活WebView为活跃状态,能正常执行网页的响应
3.web_view.onResume();
// 当页面被失去焦点被切换到后台不可见状态,需要执行onPause()
// 通过onPause()动作通知内核暂停所有的动作,比如DOM的解析、JavaScript执行等
4.web_view.onPause();
// webview调用destory时,webview仍绑定在Activity上
// 这是由于自定义webview构建时传入了该Activity的context对象
// 因此需要先从父容器中移除webview,然后再销毁webview
rootLayout.removeView(web_view);
5.web_view.destroy();
// 是否可以后退
6.web_view.canGoBack()
// 后退网页
7.web_view.goBack()
// 是否可以前进
8.web_view.canGoForward()
// 前进网页
9.web_view.goForward()
// 清除网页访问留下的缓存
// 由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
10.web_view.clearCache(true);
// 清除当前webview访问的历史记录
// 只会webview访问历史记录里的所有记录除了当前访问记录
11.web_view.clearHistory();
// 这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据
12.web_view.clearFormData();

WebViewClient的常用方法

WebViewClient用于处理各种通知和请求事件的一些方法。

onPageStarted():页面开始加载时调用,这时候可以显示加载进度条,让用户耐心等待页面的加载。
onPageFinished():页面完成加载时调用,这时候可以隐藏加载进度条,提醒用户页面已经完成加载。
onLoadResource():页面每次加载资源时调用。
shouldOverrideUrlLoading()WebView加载url默认会调用系统的浏览器,通过重写该方法,实现在当前应用内完成页面加载。
onReceivedError():页面加载发生错误时调用,这时候可以跳转到自定义的错误提醒页面,总比系统默认的错误页面美观,优化用户体验。
onReceivedHttpError():页面加载请求时发生错误。
onReceivedSslError():页面加载资源时发生错误。
shouldOverrideKeyEvent():覆盖按键默认的响应事件,这时候可以根据自身的需求在点击某些按键时加入相应的逻辑。
onScaleChanged():页面的缩放比例发生变化时调用,这时候可以根据当前的缩放比例来重新调整WebView中显示的内容,如修改字体大小、图片大小等。
shouldInterceptRequest():可以根据请求携带的内容来判断是否需要拦截请求。

WebChromeClient的常用方法

此类用于处理网站图标,网站标题,网站弹窗等,以下是相关方法

onProgressChanged():页面加载进度发生变化时调用,可以通过该方法实时向用户反馈加载情况,如显示进度条等。
onReceivedIcon():接收Web页面的图标,可以通过该方法把图标设置在原生的控件上,如Toolbar等。
onReceivedTitle():接收Web页面的标题,可以通过该方法把图标设置在原生的控件上,如Toolbar等。
onJsAlert():处理JS的Alert对话框。
onJsPrompt():处理JS的Prompt对话框。
onJsConfirm():处理JS的Confirm对话框。
onPermissionRequest()Web页面请求Android权限时调用。
onPermissionRequestCanceled()Web页面请求Android权限被取消时调用。
onShowFileChooser()Web页面上传文件时调用。
getVideoLoadingProgressView():自定义媒体文件播放加载时的进度条。
getDefaultVideoPoster():设置媒体文件默认的预览图。
onShowCustomView():媒体文件进入全屏时调用。
onHideCustomView():媒体文件退出全屏时调用。

WebSettings的相关方法

WebSettings webSettings = webView.getSettings();webSettings.setJavaScriptEnabled(true); -> 是否开启JS支持
webSettings.setPluginsEnabled(true); -> 是否开启插件支持
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); -> 是否允许JS打开新窗口webSettings.setUseWideViewPort(true); -> 缩放至屏幕大小
webSettings.setLoadWithOverviewMode(true); -> 缩放至屏幕大小
webSettings.setSupportZoom(true); -> 是否支持缩放
webSettings.setBuiltInZoomControls(true); -> 是否支持缩放变焦,前提是支持缩放
webSettings.setDisplayZoomControls(false); -> 是否隐藏缩放控件webSettings.setAllowFileAccess(true); -> 是否允许访问文件
webSettings.setDomStorageEnabled(true); -> 是否节点缓存
webSettings.setDatabaseEnabled(true); -> 是否数据缓存
webSettings.setAppCacheEnabled(true); -> 是否应用缓存
webSettings.setAppCachePath(uri); -> 设置缓存路径webSettings.setMediaPlaybackRequiresUserGesture(false); -> 是否要手势触发媒体
webSettings.setStandardFontFamily("sans-serif"); -> 设置字体库格式
webSettings.setFixedFontFamily("monospace"); -> 设置字体库格式
webSettings.setSansSerifFontFamily("sans-serif"); -> 设置字体库格式
webSettings.setSerifFontFamily("sans-serif"); -> 设置字体库格式
webSettings.setCursiveFontFamily("cursive"); -> 设置字体库格式
webSettings.setFantasyFontFamily("fantasy"); -> 设置字体库格式
webSettings.setTextZoom(100); -> 设置文本缩放的百分比
webSettings.setMinimumFontSize(8); -> 设置文本字体的最小值(1~72)
webSettings.setDefaultFontSize(16); -> 设置文本字体默认的大小webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); -> 按规则重新布局
webSettings.setLoadsImagesAutomatically(false); -> 是否自动加载图片
webSettings.setDefaultTextEncodingName("UTF-8"); -> 设置编码格式
webSettings.setNeedInitialFocus(true); -> 是否需要获取焦点
webSettings.setGeolocationEnabled(false); -> 设置开启定位功能
webSettings.setBlockNetworkLoads(false); -> 是否从网络获取资源

三、加载流程和事件回调

webview从loadUrl加载开始到onPageFinished页面加载完成,其中的加载流程和事件回调,这篇文章讲得很详细,
深入理解Android WebView的加载流程与事件回调
在这里插入图片描述

四、webview和JS之间的互相调用

对于JS调用Android方式3种:
1.通过WebView的addJavascriptInterface()进行对象映射
2.通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
(有问题,报了"ReferenceError: android is not defined")
3.通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

对于Android调用JS方式2种:
1.通过WebView的loadUrl()
2.通过WebView的evaluateJavascript()

常用方法
Android调用JS

        mWebview.evaluateJavascript("javascript:confim()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {Logger.d(TAG, "webView result: ..." + value);}});

JS调用Android

mWebview.getSettings().setJavaScriptEnabled(true);
mWebview.addJavascriptInterface(this, "android");@JavascriptInterfacepublic void closeWebview() {Logger.d(TAG, "webView onBack ...");finish();}

总结

基本的webview一些用法和相关属性介绍大致就是上面这些,webview在应用中一般用于加载免责协议,使用说明,电子手册等一些需要经常动态的多文字或多数据需要经常更新或维护的场景。

五、参考链接

  • Android 原生WebView的使用
  • Carson带你学Android:这是一份全面&详细的WebView学习攻略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL ES 共享上下文实现多线程渲染

OpenGL ES 共享上下文时,可以共享哪些资源? 共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenGL ES 和…

09C++结构体

/*结构体属于用户自定义的数据类型&#xff0c; 允许用户存储不同的数据类型, 语法:struct 结构体名{结构体成员列表} ;*/ //struct 结构体名 变量名 #include <iostream> #include <string> using namespace std; struct student { string name; int age;int s…

python第七次作业

01.设计一个函数&#xff0c;可以传入一个或多个单词的字符串&#xff0c;并返回该字符串&#xff0c;但所有五个或更多字母的单词都前后颠倒 a input("输入:") print(a) #将一句话以空格为分界拆分为单个单词 b a.split(" ") ls_1 [] ls_2 []for i i…

C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信

1. 前言 RabbitMQ是一个流行的开源消息队列系统&#xff0c;支持多种消息协议&#xff0c;广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中&#xff0c;我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…

AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)

一、预训练语言模型概述 ​ 预训练语言模型在自然语言处理领域占据着至关重要的地位。它以其卓越的语言理解和生成能力&#xff0c;成为众多自然语言处理任务的关键工具。 预训练语言模型的发展历程丰富而曲折。从早期的神经网络语言模型开始&#xff0c;逐渐发展到如今的大规…

图像处理实验一(Matlab Exercises and Image Fundamentals)

一、基本概念介绍 MATLAB是一种广泛使用的高性能语言&#xff0c;特别适用于数学计算、算法开发、数据分析和可视化。在图像处理领域&#xff0c;MATLAB提供了强大的工具和函数&#xff0c;使得图像的读取、处理和分析变得相对简单。通过MATLAB&#xff0c;用户可以实现从基本的…

番外-JDBC:2024年最新java连接数据库教程

前言 JavaScript的内容晚点更新&#xff0c;今天继续更新一点番外&#xff0c;今天更新的是jdbc&#xff0c;如何用java连接数据库 1.导包 要使java能够连接数据库我们需要导入一个包&#xff0c;请按照以下操作安装并导包 1.进入官网 MySQL 以上为官网链接进去后点击下载…

Ubuntu22.04安装DataEase

看到DataEase的驾驶舱&#xff0c;感觉比PowerBI要好用一点&#xff0c;于是搭建起来玩玩。Dataease推荐的操作系统是Ubuntu22.04/Centos 7。 下载了Ubuntu22.04和DataEase 最新版本的离线安装包 一.安装ubuntu22.04 在安装的时候&#xff0c;没有顺手设置IP地址信息&#xff…

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…

acwing算法基础03-递归,枚举

cWing 93. 递归实现组合型枚举 1.排序 考虑顺序 2. 组合 不考虑顺序 参数 -核心 递归 模板 1.指数型 选/不选 2. 排列 -考虑顺序 &#xff08;判重数组 不知道哪个数有有没有用过&#xff09;3.组合 不考虑顺序 数据范围 从n个数里选m个数 组合数中间点 取范围 #includ…

ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定

asp.net 修改上面的 IIS需要在 配置文件 添加如下内容 》》》web.config <system.web><!--<identity impersonate"true"/>--><identity impersonate"true" userName"您的账号" password"您的密码" /><co…

多角度审视推荐系统

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录 介绍 推荐工程师需要从不同的维度审视推荐系统&#xff0c;不仅抓住问题的核心&#xff0c;更要从整体上思考推荐问题。 具体包括以下内容&#xff1a; &#xff08;1&#xff09;推荐系统如何选取和处理特征…

从0开始机器学习--Day23--支持向量机

经过前面的学习&#xff0c;我们已经知道在解决问题时&#xff0c;重要的不仅仅是要在算法A或算法B中选择更优的&#xff0c;而是考虑怎么选择用于学习算法的特征和正则化参数&#xff0c;相比神经网络和逻辑回归&#xff0c;支持向量机在这两个方面做得更好。 优化目标(Optimi…

Vulnhub靶场案例渗透[9]- HackableIII

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 敏感数据获取5. 获取shell6. 提权6.1 敏感信息获取6.2 lxd提权 一、靶场搭建 1. 靶场描述 Focus on general concepts about CTF…

生成 Django 中文文档 PDF 版

文章目录 背景克隆 Django 文档和翻译仓库配置 conf.py设置和同步翻译生成 .pot 文件运行 sphinx-intl update复制翻译文件 构建 PDF生成 tex 文件安装 MikTeX生成 PDF Sphinx 生成文档 背景 浏览看到一个帖子&#xff0c;有个评论说可以用 sphinx 构建一个 pdf&#xff0c;正…

关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数

文章目录 1. memcpy函数2. memmove函数3. memset函数4. memcmp函数希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 内存函数是用于 操作内存块的一组函数&#xff0c;它们可以对内存进行复制、移动、设置和比较等操作。这些函数主要在 <str…

SpringCloud篇(注册中心 - Nacos)

目录 一、Nacos安装指南 1. Windows安装 1.1. 下载安装包 1.2. 解压 1.3. 端口配置 1.4. 启动 1.5. 访问 2. Linux安装 2.1. 安装JDK 2.2. 上传安装包 2.3. 解压 2.4. 端口配置 2.5. 启动 3. Nacos的依赖 二、Nacos注册中心的入门使用 1. 认识和安装Nacos 2. 服…

链游系统定制化开发:引领游戏产业的新时代

在数字革命的浪潮中&#xff0c;链游&#xff08;区块链游戏&#xff09;作为一种新兴游戏形式&#xff0c;正重新定义游戏产业的发展方向。链游将区块链技术与传统游戏结合&#xff0c;使游戏体验更加公平透明&#xff0c;并赋予玩家真正的资产所有权。这一领域不仅为玩家带来…

《传统视觉算法在视觉算法中的地位及应用场景

一、引言 在计算机视觉领域的发展历程中&#xff0c;传统视觉算法扮演了至关重要的角色。尽管近年来深度学习算法在视觉任务中取得了巨大的成功&#xff0c;但传统视觉算法依然具有不可替代的地位。传统视觉算法通常基于数学模型和手工设计的特征&#xff0c;具有计算效率高、…

第四十二章 Vue中使用mutations修改Vuex仓库数据

目录 一、mutations修改仓库数据 1.1. 概述 1.2. mutations修改数据基本步骤 1.3. 完整代码 1.3.1. main.js 1.3.2. App.vue 1.3.3. index.js 1.3.4. Son1.vue 1.3.5. Son2.vue 二、mutations传参语法 2.1. mutations传参基本步骤 2.2. 完整代码 2.2.1. index.js …