Android WebView详解和调用JS

2401_84152317 2024-06-29 11:03:01 阅读 65

@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-OVGre5h3-1712865382564)]

[外链图片转存中…(img-C4ONlbmu-1712865382565)]

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

[外链图片转存中…(img-CnrZM2MK-1712865382565)]

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

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

最后

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

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

资料领取方式:戳这里获取



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。