当前位置: 代码网 > it编程>编程语言>Javascript > Android WebView详解和调用JS

Android WebView详解和调用JS

2024年08月02日 Javascript 我要评论
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

@override

public void onprogresschanged(webview view, int newprogress) {

super.onprogresschanged(view, newprogress);

if (newprogress == 100) {

mprogressbar.setvisibility(view.gone);

} else {

mprogressbar.setvisibility(view.visible);

mprogressbar.setprogress(newprogress);

}

}

});

(2)如果希望浏览的网页后退而不是退出浏览器,需要webview覆盖url加载,让它自动生成历史访问记录,那样就可以通过前进或后退访问已访问过的站点。

/**

  • 在onkeydown中设置webview在返回的时候

  • 自动记录浏览记录

  • @param keycode

  • @param event

  • @return

*/

@override

public boolean onkeydown(int keycode, keyevent event) {

if (keycode == keyevent.keycode_back){

if (mwebview.cangoback()){

mwebview.goback();

return true;

}else {

finish();

}

}

return super.onkeydown(keycode, event);

}

(3)创建一个自己的webviewclient,通过setwebviewclient关联

//覆盖webview默认使用第三方或系统默认浏览器打开网页的行为,使网页用webview打开

mwebview.setwebviewclient(new webviewclient() {

@override

public boolean shouldoverrideurlloading(webview view, string url) {

//返回值是true的时候控制去webview打开,为false调用系统浏览器或第三方浏览器

view.loadurl(url);

return true;

}

/**

  • 1.网页页面开始加载的时候,执行的回调方法,可以实现加载等待界面

  • 2.在此方法中设置一个超时计时器

  • @param view

  • @param url

  • @param favicon

*/

@override

public void onpagestarted(webview view, string url, bitmap favicon) {

super.onpagestarted(view, url, favicon);

mlinearlayout.setvisibility(view.gone);

mrelativelayout.setvisibility(view.visible);

}

/**

  • 1.网页加载结束的时候,也要隐藏等待界面

  • 2.onpagefinished指页面加载完成,完成后取消计时器

  • @param view

  • @param url

*/

@override

public void onpagefinished(webview view, string url) {

super.onpagefinished(view, url);

mlinearlayout.setvisibility(view.visible);

mrelativelayout.setvisibility(view.gone);

}

/**

  • 加载异常的界面

  • @param view

  • @param request

  • @param error

*/

@override

public void onreceivederror(webview view, webresourcerequest request, webresourceerror error) {

super.onreceivederror(view, request, error);

log.d(“testtimeout”, “-----------加载异常”);

}

});

(4)访问的页面中有javascript,则webview必须设置支持javascript

websettings mwebsettings = mwebview.getsettings();

mwebsettings.setjavascriptenabled(true);

(5)缓存的使用

优先使用缓存

mwebview.getsettings().setcachemode(websettings.load_cache_else_network);

不使用缓存

mwebview.getsettings().setcachemode(websettings.load_no_cache);

特殊使用

先给大家说说怎么获取这个html的标题title

应用开发的时候使用webview这个组件的过程中可能会接触到webviewclient与webchromeclient,那么这两个类到底有什么不同呢 ,webviewclient主要帮助webview处理各种通知、请求事件的,比如:

onloadresource

onpagestart

onpagefinish

onreceiveerror

onreceivedhttpauthrequest

webchromeclient主要辅助webview处理javascript的对话框、网站图标、网站title、加载进度等比如

onclosewindow(关闭webview)

oncreatewindow()

onjsalert (webview上alert无效,需要定制webchromeclient处理弹出)

onjsprompt

onjsconfirm

onprogresschanged

onreceivedicon

onreceivedtitle

我们在 webchromeclient 中的 onreceivedtitle() 方法里判断html页面的标题中是否含有 “error”,如果有,则证明html加载失败,设置加载失败的标记,让在 webviewclient 的完成是回 调的 onpagefinish() 方法里显示自定义的加载失败的页面。

使用的是不要忘了添加网络权限:

最后张贴一下全部代码:

public class mainactivity extends appcompatactivity {

private webview mwebview;

private progressbar mprogressbar;

private linearlayout mlinearlayout;

private relativelayout mrelativelayout;

@override

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.activity_main);

toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar);

setsupportactionbar(toolbar);

init();

}

private void init() {

mwebview = (webview)findviewbyid(r.id.webview);

mprogressbar = (progressbar)findviewbyid(r.id.progressbar);

mlinearlayout = (linearlayout)findviewbyid(r.id.linearlayout);

mrelativelayout = (relativelayout)findviewbyid(r.id.relativwlayout);

//webview加载web资源

mwebview.loadurl(“https://www.baidu.com/”);

/**

  • 对webview设置监听器

*/

websettings mwebsettings = mwebview.getsettings();

mwebsettings.setjavascriptenabled(true);

mwebview.setwebchromeclient(new webchromeclient() {

@override

public void onprogresschanged(webview view, int newprogress) {

super.onprogresschanged(view, newprogress);

if (newprogress == 100) {

mprogressbar.setvisibility(view.gone);

} else {

mprogressbar.setvisibility(view.visible);

mprogressbar.setprogress(newprogress);

}

}

});

//覆盖webview默认使用第三方或系统默认浏览器打开网页的行为,使网页用webview打开

mwebview.setwebviewclient(new webviewclient() {

@override

public boolean shouldoverrideurlloading(webview view, string url) {

//返回值是true的时候控制去webview打开,为false调用系统浏览器或第三方浏览器

view.loadurl(url);

return true;

}

/**

  • 1.网页页面开始加载的时候,执行的回调方法,可以实现加载等待界面

  • 2.在此方法中设置一个超时计时器

  • @param view

  • @param url

  • @param favicon

*/

@override

public void onpagestarted(webview view, string url, bitmap favicon) {

super.onpagestarted(view, url, favicon);

mlinearlayout.setvisibility(view.gone);

mrelativelayout.setvisibility(view.visible);

}

/**

  • 1.网页加载结束的时候,也要隐藏等待界面

  • 2.onpagefinished指页面加载完成,完成后取消计时器

  • @param view

  • @param url

*/

@override

public void onpagefinished(webview view, string url) {

super.onpagefinished(view, url);

mlinearlayout.setvisibility(view.visible);

mrelativelayout.setvisibility(view.gone);

}

/**

  • 加载异常的界面

  • @param view

  • @param request

  • @param error

*/

@override

public void onreceivederror(webview view, webresourcerequest request, webresourceerror error) {

super.onreceivederror(view, request, error);

log.d(“testtimeout”, “-----------加载异常”);

}

});

//设置访问文件

mwebsettings.setallowcontentaccess(true);

mwebsettings.setcachemode(websettings.load_no_cache);

}

/**

  • 在onkeydown中设置webview在返回的时候

  • 自动记录浏览记录

  • @param keycode

  • @param event

  • @return

*/

@override

public boolean onkeydown(int keycode, keyevent event) {

if (keycode == keyevent.keycode_back){

if (mwebview.cangoback()){

mwebview.goback();

return true;

}else {

finish();

}

}

return super.onkeydown(keycode, event);

}

}

webview调用js的使用方式

(1)首先写js文件 js_test.js

function alertfromjs(content){

alert(“from js:” + content);

}

简单的一个函数,功能就是弹出一个alert。

写html文件 index.html,在html里加载js文件,注意路径

js test

加载html网页成功!

将index.html和js_test.js放到jstest文件夹里,将jstest放入到安卓工程assets中。

写xml布局文件:

<linearlayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽

自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-hza4mcd6-1712396465102)]

[外链图片转存中…(img-vfdscf4b-1712396465103)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-cozcyxxx-1712396465103)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com