Android中WebView使用全解

开始

在Android系统中内嵌的WebKit,这是一个浏览器内核,它帮助着我们可以浏览网页。在实际开发中,如果你想让你的App能够访问网页,那就需要用到WebView这个控件。

如何使用?

其实使用起来很简单,通常情况下我们会在布局XML中写入这个控件之后在Activity中进行调用:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/web">

 

Activity/Fragment中:

WebView webView = (WebView) findViewById(R.id.web);

webView.loadUrl("https://lovelyyakir.github.io");

运行一下就能看到这样的效果:


1-1

 

使用进阶

webView的跳转和返回

在实际使用中你会发现,有时候我们需要点击网页中的某个链接进行网页跳转,而系统会默认加载自带浏览器,而不是我们的WebView。如果你想要让WebView跳转那又该怎么做呢?

其实很简单,我们只需要给WebView设置一个webClient,并且重写里面的shouldOverrideUrlLoading()就能很简单的实现啦。

webView.setWebViewClient(new WebViewClient(){

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return true;

}

});

谷歌工程师给我们提供了两个参数,我们需要调用load方法传入url,并且需要在返回值中返回true。允许在本WebView中进行跳转。当我们点击返回,你会发现程序退出了。当然这不是

我们想要的结果。所以我们需要在Activity中重写onKeyDown(),进行判断,当我们的页面可以返回时点击返回,返回上一个界面,无法返回执行其他操作或者退出。

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (webView.canGoBack()&&keyCode==KeyEvent.KEYCODE_BACK) {

webView.goBack();

return true;

}

return super.onKeyDown(keyCode,event);

}

便是这个效果:


1-2
强制关闭某个Web界面

在Native与H5交互完成的情况之下,我们需要主动关闭当前的WebView回到原生界面,这时候又该如何处理呢?其实解决途径有很多这里介绍两种解决方法:

1.我们可以监听到最后的网页的Url获取Url之后通过字符串匹配的方式关闭当前界面,你可以在WebClient中重写下面这个方法,将跳转的URL取出来。

@Override

public voidonLoadResource(WebViewview,Stringurl){

//监听到进入了关闭页面就把activity关闭

LogUtil.e("跳转的url:"+url);

}

通过匹配字符串做相应的操作。

2.通过控制台获取相关的信息,根据信息做相应操作。

webView.setWebChromeClient(newWebChromeClient(){

@Override

public boolean onConsoleMessage(ConsoleMessageconsole Message){

LogUtil.e(consoleMessage.message());

if("success".equals(consoleMessage.message())||"close window".equals(consoleMessage.message())){

finish();

}

return super.onConsoleMessage(consoleMessage);

}

});

通过WebView的setChromClient重写onConsoleMessage通过相关的信息做相应的操作。

进阶操作

WebView与Javascript进行交互

在实际开发中,调用webview,我们希望能与其他其他网页进行交互。非原生界面调用原生方法,原生界面调用非原生方法。(WebView与Javascript相互调用)。

1.Javascript调用Java原生代码

我们先看一段Javascript的代码:

$("#test1").click(function(e){window.injs.takeFrontIDCardCamera();});

$("#test2").click(function(e){window.injs.takeBackIDCardCamera();});

$("#test3").click(function(e){window.injs.takeFaceCamera();});

这里表示三个Javascript点击事件,window.injs.takeFaceCamera();这行代码中window表示窗口,injs表示作用域,紧跟着的就是方法名了。我们需要让WebView允许和Javascript进行交互,并且绑定作用域。

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavascriptInterface(this,"injs");

最后重写Javascript方法:

@JavascriptInterface

public void takeFrontIDCardCamera() {

Toast.makeText(this,"Native get takeFrontIDCardCamera",Toast.LENGTH_SHORT).show();

}

@JavascriptInterface

public void takeBackIDCardCamera() {

Toast.makeText(this,"Native get takeBackIDCardCamera",Toast.LENGTH_SHORT).show();

}

@JavascriptInterface

public void takeFaceCamera() {

Toast.makeText(this,"Native get takeFaceCamera",Toast.LENGTH_SHORT).show();

}

Javascript调用原生方法时弹出一个土司验证

 


1-3

2.原生界面调用Javascript

下面展示几个Javascript本地方法

function  jhjcardfontjs(font){

alert(font);

}

function  jhjcardbackjs(back){

alert(back);

}

function jhjfacejs(face){

alert(face);

}

调用无参的方法时只需要在webview的load方法中写入javascript:你的方法()。像这样:

webView.loadUrl("javascript:jhjcardfontjs()");

如果有参数要注意,脚本中会有转义符需要处理一下再传入:

String var="";

var=var.replaceAll("\\\\", "\\\\\\\\");

webView.loadUrl("javascript:jhjcardfontjs('" + var + "')");

登陆Session同步

用户通过原生App进行登录,之后进行某些操作到H5界面,这个时候原生界面和H5界面的登陆状态不同,为了防止用户再次登陆造成的用户体验问题,我们需要让WebView同步我们原声界面的Session让用户不用重新登陆。

1.获取用户登录信息Cookie,你可以通过你使用的网络请求框架获取Cookie。这里我使用OkHttp获取我的Cookie信息,之后将这个信息保存起来:

Listcookies=OkHttpUtils

.getInstance()

.getOkHttpClient()

.cookieJar()

.loadForRequest(HttpUrl.parse(SysConfig.myFinalUrl(SysConfig.loginUrl)));

for(Cookiecookie:cookies){

//保存在内存当中

if(!cookie.value().contains("dk")){

Constant.appCookie=cookie;

}

}

 

2.在WebView中加载他:

CookiesessionCookie=Constant.appCookie;//这里的cookie就是上面保存的cookie

CookieSyncManager.createInstance(this);

CookieManagercookieManager=CookieManager.getInstance();

if(sessionCookie!=null){

cookieManager.removeSessionCookie();

StringcookieString=sessionCookie.name()+"="+sessionCookie.

value()+"; domain="+sessionCookie.domain();

cookieManager.setCookie(sessionCookie.domain(),cookieString);

CookieSyncManager.getInstance().sync();

wbQrContent.setWebViewClient(newWebViewClient(){

@Override

public booleanshouldOverrideUrlLoading(WebViewview,Stringurl){

view.loadUrl(url);

return true;

}

});

}

补充

1.WebViewClient和WebChromeClient有什么不同?

WebViewClient主要帮助WebView处理各种通知、请求事件而如果你想处理js、进度条等,就要用到WebChromeClient。他们的区别在于功能的区别。

2.为什么我调用JS修改原生UI报错了?

如果你在JavaScript中调用原生方法修改Ui,你需要确保这个方法执行在主线程。这是由于JavaBridge并不在主线程中。(你可以使用hander,runOnUiThread,Rxjava)

转载于:https://www.cnblogs.com/lovelyYakir/p/7125216.html

龙虾 Skill 技能库|OpenClaw+Hermes 全集成 一键调用所有 AI 技能 龙虾 Skill 技能库、OpenClaw、Hermes Agent、AI 技能集成、本地 AI 自动化、办公工具、数字员工 阅读详情

相关推荐

深入IR2104数据手册:被忽略的SD引脚用法和死区时间调节实战

本文深入解析IR2104半桥驱动芯片的SD引脚用法和死区时间调节技巧,帮助硬件工程师优化电机控制和电源转换系统。通过详细的电路设计、实测数据和调试方法,揭示SD引脚的多重保护机制和死区时间的精密调节策略,提升系统安全性和效率。

weixin_30342363的博客 391

Android开发之WebView

一、WebView 当我们需要在应用程序中展示网页,又不允许打开系统浏览器的时候,便可以借助WebView控件的帮忙。 step1:修改xml代码如下:<WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="matc

Egg66666的博客 868

IEEE ACCESS Please note that all author names should be listed in English.(所有作者名需用英文名列出)

很奇怪哈,我明明手稿和提交页面作者都是用的英文,但是为什么还是会提示我没用英文呢?后来给编辑发消息,回的很快,他给我发了一个截图,确实是出现中文,但是我还是不知道为啥会出现中文。直到晚上回寝室洗澡的时候忽然想起来了是不是orcid的原因,因为它会强制作者绑定一个orcid账号,而我的orcid账号的名字刚好是中文的。当然这个只是我的一个猜想,但是我觉得可能性很大。我的第二篇论文已经投稿了快三个月了,效果非常的不好,所以我打算转投IEEE ACCESS了,希望这里可以给我一点好的建议。

kuyecsl的博客 3310

android webview实例,android WebView 使用实例

主布局文件:android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" >android:layout_width="fill_parent"android:layout_height="wrap_content">android:layout...

weixin_29432775的博客 200

数字孪生成熟度的L0-L4五级划分,各自特征和应用场景

数字孪生的分级(或成熟度模型)通常用于描述其技术复杂度和功能完备性的演进过程。3D设计模型(CAD)、建筑信息模型(BIM)、产品数字化手册。全自动驾驶系统、自适应智能电网、 “黑灯工厂”的自主调度。多学科模型融合、 “What-if”分析、提供决策建议。IoT设备监控平台、预测性维护(报警)、智慧仪表盘。工艺仿真优化、资产性能管理、手术方案预演、虚拟调试。状态监控、历史回溯、阈值报警、根因分析。可视化、数字化档案。自优化、自适应、目标驱动、高度自治。传统设备、纸质记录的管理模式。无或仅有离线、孤立数据。

2401_82881178的博客 1553

IOPaint模型部署教程

IOPaint是一款功能全面且强大的AI图像处理工具,它不仅免费开源,还由SOTA(State-of-the-Art,即最先进)AI模型驱动,为图像编辑和修复带来了前所未有的便利和高效。以下是对IOPaint的详细介绍:

SJJS_1的博客 1543

android webview onloadresource,Android WebView使用详解

一、WebView的设置//支持获取手势焦点,输入用户名、密码或其他webview.requestFocusFromTouch();WebSettings webSettings = mWebView .getSettings();webSettings.setJavaScriptEnabled(true); //支持js,如果不设置本行,html中的js代码都会失效webSettings.se...

weixin_39737636的博客 1825

ComfyUI实战:AnimateDiff与ControlNet结合,打造无缝风格化视频转绘

本文详细介绍了如何利用ComfyUI平台,结合AnimateDiff与ControlNet插件,实现高质量的视频风格化转绘。通过搭建节点工作流、调整关键参数,有效解决画面闪烁与失真问题,并分享了进阶玩法与常见问题解决方案,帮助用户轻松打造流畅、风格统一的动态视觉效果。

weixin_29039773的博客 339

Android之 WebView的使用

WebView的使用

qq_29848853的博客 8299

19. SAP UI5 应用开发教程之十九 - SAP UI5 数据类型和复杂的数据绑定

通过本教程前面的步骤SAP UI5 初学者教程之十七 - 聚合绑定在 UI5 复合控件中的使用的介绍,我们已经学会了如何在 SAP UI5 里显示列表,如下图所示: 本步骤我们给该列表添加更多的业务数据,比如每张发票的金额。 按照本文的步骤完成的 SAP UI5 应用,列表如下图所示: 可以看到,同前一个步骤相比,现在 Invoices 表格里,每张发票的金额和货币单位已经显示出来了。 为了实现这个效果,本步骤的源代码位于我的 Github 这个文件夹下面: https://github.com/wan

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3692

【Charge】仿真目录

Author: JiJi\textrm{Author: JiJi}Author: JiJi Created Time: 2026.01.20\textrm{Created Time: 2026.01.20}Created Time: 2026.01.20 Modified Time: 2026.01.20\textrm{Modified Time: 2026.01.20}Modified Time: 2026.01.20工作流程材料模型[Charge] 电荷分布与折射率变化理论 [Charge] FDTD

u011699626的博客 317

Android WebView控件的使用进阶

webview使用进阶WebViewClientWebViewClient是webview的一个辅助类,我们经常使用WebViewClient这个类来监控webview加载网页的状态。 下面的是我们在开发中经常会使用的方法。onLoadResource网页加载网页各种资源的回调,比如你的网页使用了各种图片和css文件与js文件onPageStarted 网页开始加载的回调onPageFinishe...

达帮主 1319

6.4 直流无刷电机(BLDC):测试与性能评估

本文系统阐述了直流无刷电机(BLDC)的测试与性能评估方法,涵盖参数测量、性能测试、测试平台设计及可靠性评估。详细介绍了绕组电阻、电感和反电动势的测量原理与修正方法,以及转矩-转速特性、效率分析和动态响应测试的技术要点。通过搭建高精度测功机系统,结合自动化数据处理,实现对电机性能的全面评估。最后讨论了温升、振动、EMC等特殊测试方法,为BLDC电机的设计验证和质量控制提供了完整的技术路径。

技术工作者 444

android webview 全解

最近项目里用到越来越多的webview,

qq_28533013的博客 776

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android应用篇 - WebView 与 JS 全解与实战

这章来讲讲 Android 与 JS 的互相调用。 目录: Android 调用 JS JS 调用 Android WebView 漏洞与内存泄漏 Dapp Brower 1. Android 调用 JS 1.1 方式 Android 调用 JS 有两种方式: 通过 WebView 的 loadUrl()。 通过 WebView 的 evaluateJa...

u014294681的博客 1376

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android webview 例子,android中的webview使用实例大全

1. 打开网页时不调用系统浏览器, 而是在本WebView中显示:mWebView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}});2. 通过java代码...

weixin_39933724的博客 302

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

移动开发周刊:Android WebView 学习计划、Scroller 工作机制全解

写在前面从 2011 年的第 1 期开始,移动开发周刊已经走过了 5 年多的时间。今天第167期与大家见面了,在这一期中,包含了技术文章、视频教程、活动充电 3 个部分,希望通过这些线上、线下的优质内容,让你有一点收获,不虚看它的星点时光,也欢迎提一些优化建议。技术文章AndroidAndroid WebView简要介绍和学习计划我们通常会在App的UI中嵌入WebView,用来实现某些功能的动态...

一起来捉 Bug 呀~~ 521

android webview详解,Android webview详解

1.1.打开网页时不调用系统浏览器,而是在本WebView中显示:[代码]java代码:mWebView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}});...

weixin_36374366的博客 568

Android-Security-Teryaagh常见攻击面全解:不安全存储、不安全IPC与WebView的6大漏洞

开源项目 Android-Security-Teryaagh 是一个一站式的 Android 安全学习路线图与资源库。本文带你逐一拆解其中梳理的 6 大常见攻击面——不安全数据存储、不安全 IPC、WebView 漏洞、不安全数据传输、权限问题与不安全日志,并附上动手练习与排查思路,帮你快速建立 Android 应用安全审计的完整认知。 ## 项目一览:Android 安全学习路线图 Andr

gitblog_00824的博客 656

Android webview使用详解

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34092370的博客 104

Android Webview

http://www.cnblogs.com/zgz345/p/3768174.html 1. 打开网页时不调用系统浏览器, 而是在本WebView中显示: mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(

haocaige 288

Android WebView

Adndroid 2.x的设置 在Android 2.x下,设置webview背景为透明的方法: wvContent.setBackgroundColor(0);   Adndroid 4.0  由于硬件加速导致以上的设置无效,关闭webview的硬件加速: android:layerType="software"

漫游学海之旅 719

GitHub上这份《Android 移动安全知识技术全解》火了~

安全问题长久以来就是Android系统的一大弊病,很多人也因此舍弃Android选择了苹果,作为一个Android Developer,我们需要对用户的隐私负责,更需要对用户的数据安全倾尽全力。想到这里,我就热血沸腾,仿佛自己化身正义的天使(我编不下去了。。。)。 现在,我们回归正题,给大家分享这份阿里云团队全新开源的《Android 移动安全知识技术全解》,全面总结了 移动安全 企业级应用的解决方案,包括了基本概念、加固、常规漏洞、各系统版本特性、Hook技术和逆向分析等方面,更具深度、广度、实用性!希望

Android23333的博客 1071

WebView详解

在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件 WebView在开发过程中应该注意几点:     1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Webpage not available错误。     2.如果访问的页面中有Javascript,则w

www.coderr.org 969

weiview 笔记

WebView在开发过程中应该注意几点:      1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。     2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。     WebSettings webSetting =...

iteye_16050的博客 308

Android使用WebView的一些记录

项目中webview使用的一些记录

dorytmx的博客 833
上一篇: 两个onCreate方法?你真的了解onCreate()么?
下一篇: Android中MD5加密
diebing0439
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值