安卓高级开发下笔记共17周第十三周.docx
- 文档编号:20108124
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:16
- 大小:71.20KB
安卓高级开发下笔记共17周第十三周.docx
《安卓高级开发下笔记共17周第十三周.docx》由会员分享,可在线阅读,更多相关《安卓高级开发下笔记共17周第十三周.docx(16页珍藏版)》请在冰豆网上搜索。
安卓高级开发下笔记共17周第十三周
第三章Android网络应用
第四节使用WebView显示网页
WebView的一些常用方法
Ø前进/后退网页
booleancanGoBack=webView.canGoBack();//WebView是否可以后退
webView.goBack();//WebView后退
booleancanGoForward=webView.canGoForward();//WebView是否可以前进
webView.goForward();//WebView前进
booleancanGoBackOrForward=webView.canGoBackOrForward(step);//以当前的index为起始点前进或者后退到历史记录中指定的steps;如果steps为负数则为后退,正数则为前进
注意,点击系统返回键时,是结束当前的Activity,而非调用WebView的goBack()方法。
也就是会结束整个浏览器,而不是网页后退
解决方案:
在当前Activity中处理并重写onKeyDown事件,在该事件中调用goBack()方法
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if((keyCode==KEYCODE_BACK)&&mWebView.canGoBack()){
mWebView.goBack();
returntrue;
}
returnsuper.onKeyDown(keyCode,event);
}
Ø重新加载网页和停止加载
webView.reload();//刷新页面(当前页面的所有资源都会重新加载)
webView.stopLoading();//停止加载
Ø清除浏览器缓存
Webview.clearCache(true);//清除网页访问留下的缓存,由于内核缓存是全局的,因此这个方法不仅仅针对webview而是针对整个应用程序.
Webview.clearHistory();//清除当前webview访问的历史记录,只会webview访问历史记录里的所有记录除了当前访问记录
Webview.clearFormData();//这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据
Ø获取WebView高度、内容HTML高度和滚动距离
webView.getScrollY();//获取当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离。
webView.getHeight();//获取WebView控件的高度。
webView.getContentHeight();//获取HTML的高度(原始高度,不包括缩放后的高度)
WebView的常用工具类
ØWebSettings类
作用:
对WebView进行配置和管理
WebSettings用于管理WebView状态配置,当WebView第一次被创建时,WebView包含着一个默认的配置,这些默认的配置将通过get方法返回,通过WebView中的getSettings方法获得一个WebSettings对象,如果一个WebView被销毁,在WebSettings中所有回调方法将抛出IllegalStateException异常。
WebSettingswebSettings=webView.getSettings();
ØwebSettings.setJavaScriptEnabled(true);
如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
ØwebSettings.setUseWideViewPort(true);
设置WebView是否使用viewport,当该属性被设置为false时,加载页面的宽度总是适应WebView控件宽度;当被设置为true,当前页面包含viewport属性标签,在标签中指定宽度值生效,如果页面不包含viewport标签,无法提供一个宽度值,则适应WebView控件宽度。
ØwebSettings.setLoadWithOverviewMode(true);
是否允许WebView度超出以概览的方式载入页面,默认false。
即缩小内容以适应屏幕宽度。
该项设置在内容宽度超出WebView控件的宽度时生效,例如当getUseWideViewPort()返回true时。
ØwebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
设置布局,会引起WebView的重新布局(relayout)
LayoutAlgorithm是一个枚举用来控制页面的布局,有三个类型:
1.NARROW_COLUMNS:
可能的话使所有列的宽度不超过屏幕宽度
2.NORMAL:
正常显示不做任何渲染
3.SINGLE_COLUMN:
把所有内容放大webview等宽的一列中
缩放操作
ØwebSettings.setSupportZoom(true);
设置WebView是否支持使用屏幕控件或手势进行缩放,默认是true,支持缩放。
ØwebSettings.setBuiltInZoomControls(true);
设置WebView是否使用内置的缩放机制。
内置的缩放机制包括屏幕上的缩放控件(浮于WebView内容之上)和缩放手势的运用。
ØwebSettings.setDisplayZoomControls(false);
设置WebView使用内置缩放机制时,是否展现在屏幕缩放控件上,默认true,展现在控件上。
ØwebSettings.setTextZoom
(2);
设置WebView中页面上的文本缩放百分比,默认100
ØwebSettings.setStandardFontFamily("");
设置WebView的字体,默认字体为"sans-serif"
ØwebSettings.setDefaultFontSize(20);
设置WebView字体的大小,默认大小为16
ØwebSettings.setMinimumFontSize(12);
设置WebView支持的最小字体大小,默认为8
Ø5.1以上默认禁止了https和http混用,以下方式是开启
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
⏹在Android5.0以及以上的系统,当WebView加载的链接为Https开头,但是链接里面的内容,比如图片为Http链接,这时候,图片就会加载不出来,在浏览器中的Console会有如下警告log
⏹从Android5.0开始,WebView默认不支持同时加载Https和Http混合模式。
⏹从Android5.0以后,当一个安全的站点(https)去加载一个非安全的站点(http)时,需要配置Webview加载内容的混合模式,一共有如下三种模式:
✓MIXED_CONTENT_NEVER_ALLOW:
Webview不允许一个安全的站点(https)去加载非安全的站点内容(http),比如,https网页内容的图片是http链接。
强烈建议App使用这种模式,因为这样更安全。
✓MIXED_CONTENT_ALWAYS_ALLOW:
在这种模式下,WebView是可以在一个安全的站点(Https)里加载非安全的站点内容(Http),这是WebView最不安全的操作模式,尽可能地不要使用这种模式。
✓MIXED_CONTENT_COMPATIBILITY_MODE:
在这种模式下,当涉及到混合式内容时,WebView会尝试去兼容最新Web浏览器的风格。
一些不安全的内容(Http)能被加载到一个安全的站点上(Https),而其他类型的内容将会被阻塞。
这些内容的类型是被允许加载还是被阻塞可能会随着版本的不同而改变,并没有明确的定义。
这种模式主要用于在App里面不能控制内容的渲染,但是又希望在一个安全的环境下运行。
其他操作
ØwebSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
重写缓存被使用到的方法,该方法基于NavigationType;加载普通的页面,将会检查缓存同时重新验证是否需要加载,如果不需要重新加载,将直接从缓存读取数据,允许客户端通过指定LOAD_DEFAULT、LOAD_CACHE_ELSE_NETWORK、LOAD_NO_CACHE、LOAD_CACHE_ONLY其中之一重写该行为方法,默认值LOAD_DEFAULT
⏹缓存模式如下:
✓LOAD_CACHE_ONLY:
不使用网络,只读取本地缓存数据
✓LOAD_DEFAULT:
(默认)根据cache-control决定是否从网络上取数据。
✓LOAD_NO_CACHE:
不使用缓存,只从网络获取数据.
✓LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据
⏹设置WebView缓存
当加载html页面时,WebView会在/data/data/包名目录下生成database与cache两个文件夹
请求的URL记录保存在WebViewCache.db,而URL的内容是保存在WebViewCache文件夹下
ØwebSettings.setAllowFileAccess(true);
设置在WebView内部是否允许访问文件,默认允许访问。
ØwebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
设置脚本是否允许自动打开弹窗,默认false,不允许
ØwebSettings.setLoadsImagesAutomatically(true);
设置WebView是否加载图片资源,默认true,自动加载图片
ØwebSettings.setDefaultTextEncodingName("utf-8");
设置WebView加载页面文本内容的编码,默认“UTF-8”。
ØwebSettings.setGeolocationEnabled(true);
设置是否开启定位功能,默认true,开启定位
ØwebSettings.setUserAgentString("Mozilla/5.0(WindowsNT10.0;WOW64;rv:
50.0)Gecko/20100101Firefox/50.0");
设置WebView代理字符串(User-Agent),如果String为null或为空,将使用系统默认值
ØwebSettings.setAllowFileAccess(false);
设置在WebView内部是否允许访问文件,默认允许。
注意,这里只是允许或禁止对文件系统的访问,Assets和resources文件使用file:
///android_asset和file:
///android_res仍是可访问的。
ØWebViewClient类
⏹在使用WebView加载资源过程中,可能会有大量各种类型事件的回调,为了方便开发组处理这些回调,针对不同的事件回调,google将这些回调进行了分类集合,于是就产生了WebViewClient、WebChromeClient这两个大类。
⏹WebViewClient:
在影响【View】的事件到来时,会通过WebViewClient中的方法回调通知用户
⏹WebChromeClient:
当影响【浏览器】的事件到来时,就会通过WebChromeClient中的方法回调通知用法。
⏹实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。
作用:
处理各种通知&请求事件
WebViewClientmWebViewClient=newWebViewClient()
{
}
ØWebViewClient类常用方法:
⏹publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl)
拦截URL请求,重定向。
无论返回true还是false,只要为WebView设置了WebViewClient,系统就不会再将url交给第三方的浏览器去处理了。
其中返回false,代表将url交给当前WebView加载,也就是正常的加载状态;shouldOverrideUrlLoading()返回true,代表开发者已经对url进行了处理,WebView就不会再对这个url进行加载了。
另外,使用post的方式加载页面,此方法不会被调用。
webView.setWebViewClient(newWebViewClient(){
//重定向URL请求,返回true表示拦截此url,返回false表示不拦截此url。
@Override
publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
//作用1:
重定向url
if(url.startsWith("weixin:
//")){
url=url.replace("weixin:
//","http:
//");
webView.loadUrl(url);
}
//作用2:
在本页面的WebView打开,防止外部浏览器打开此链接
view.loadUrl(url);
returntrue;
}
});
提供给当前应用一个机会去单独处理WebView即将加载的一个新链接。
如果 WebViewClient没有设置,也就是没有调用 WebView 的setWebViewClient方法,那默认就会让用户去选择一个浏览器应用,比如系统浏览器去加载这个新的链接了。
那如果 WebViewClient是设置了的,返回True代表当前应用已经处理了这个新链接了
⏹publicvoidonPageStarted(WebViewview,Stringurl,Bitmapfavicon)
当内核开始加载访问的url时会通知应用程序;这个函数只会被调用一次,页面包含iframe或者framesets不会另外调用一次onPageStarted,当网页内内嵌的frame发生改变时也不会调用onPageStarted。
⏹publicvoidonPageFinished(WebViewview,Stringurl)
当内核加载完当前页面时会通知我们的应用程序,这个函数只有在mainframe情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新
⏹publicvoidonLoadResource(WebViewview,Stringurl)
通知应用程序WebView即将加载url指定的资源。
注意,每一个资源(比如图片)的加载都会调用一次此方法。
⏹WebResourceResponseshouldInterceptRequest(WebViewview,WebResourceRequestrequest)
通知资源请求的主机应用程序,并允许应用程序返回数据。
该函数会在请求资源前调用,且无论任何资源,比如超链接、JS文件、图片等,在每一次请求资源时都会回调。
我们可以通过返回一个自定义的WebResourceResponse来让WebView加载指定的资源。
比如,如果我们需要改变网页的背景,替换网页中图片等,都可以在这个回调时处理。
但是必须注意的是,此回调是在非UI线程中执行的。
⏹voidonReceivedError(WebViewview,WebResourceRequestrequest,WebResourceErrorerror)
当浏览器访问指定的网址发生错误时会通知我们应用程序,比如网络错误。
我们可以在这里做错误处理,比如再请求加载一次,或者提示404的错误页面。
⏹voidonReceivedHttpError(WebViewview,WebResourceRequestrequest,WebResourceResponseerrorResponse)
通知主机应用程序在加载资源时从服务器收到HTTP错误。
⏹voidonReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror)当网页加载资源过程中发现SSL错误时回调。
ØWebChromeClient类
WebChromeClient是辅助WebView处理JavaScript的对话框,网站图标,网站title,加载进度等:
WebChromeClientmWebChromeClient=newWebChromeClient()
ØWebChromeClient类常用方法:
⏹voidonProgressChanged(WebViewview,intnewProgress)
一定要注意,底层实现时,是利用handler来定时轮循当前进度的,每隔一定时间查询一次,所以每次拿到的进度数据是不一样的。
获取网页中的基本信息
⏹voidonReceivedTitle(WebViewview,Stringtitle)
获取标题,通常获取标题的时间主要取决于网页前段设置标题的位置,一般设置在页面加载前面,可以较早调用到这个函数
⏹voidonJsAlert(WebViewview,Stringurl,Stringmessage,finalJsResultresult)
拦截javascript的alert警告框
AlertDialog:
AlertDialog的构造方法被声明为protected,所以不能直接使用new关键字来创建AlertDialog类的对象实例。
要想创建AlertDialog对话框,需要使用Builder类,该类是AlertDialog类中定义的一个内嵌类。
因此必须创建AlertDialog.Builder类的对象实例,然后再调用show()来显示对话框。
例如:
AlertDialog.Builderdb=newBuilder(this);
db..create().show();
对话框的五个基本元素
1.title:
设置Dialog的标题,setTitle(“Title”)。
2.Message:
设置Dialog的内容,setMessage(“HelloAlertDialog”)。
3.PositiveButton:
设置Yes/Ok的文字及其回调,setPositiveButton(“Positive”,listener)。
4.NeutralButton:
设置中立行为的文字及其回调,setNeutralButton(“Neutral”,listener)
5.Negative:
设置No/Cancel的文字及其回调,setNegativeButton(“Negative”,listener)
*setItems:
设置对话框要显示的一个list,一般用于显示几个命令时;
*setMultiChoiceItems:
用来设置对话框显示一系列的复选框;
*setView:
给对话框设置自定义样式;
*setSingleChoiceItems
⏹onJsConfirm(WebViewview,Stringurl,Stringmessage,finalJsResultresult)
拦截javascript的Confirm确认框
publicbooleanonJsConfirm(WebViewview,Stringurl,Stringmessage,finalJsResultresult){
newAlertDialog.Builder(MainActivity.this)
.setTitle("JsConfirm")
.setMessage(message)
.setPositiveButton("OK",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
result.confirm();
}
})
.setNegativeButton("Cancel",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
result.cancel();
}
})
.setCancelable(false)
.show();
//返回布尔值:
判断点击时确认还是取消
//true表示点击了确认;false表示点击了取消;
returntrue;
⏹onJsPrompt(WebViewview,Stringurl,Stringmessage,StringdefaultValue,finalJsPromptResultresult)
拦截javascript的输入框
点击确认返回输入框中的值,点击取消返回null。
@Override
publicbooleanonJsPrompt(WebViewview,Stringurl,Stringmessage,StringdefaultValue,finalJsPromptResultresult){
finalEditTextet=newEditText(MainActivity.this);
et.setText(defaultValue);
newAlertDialog.Builder(MainActivity.this)
.setTitle(message)
.setView(et)
.setPositiveButton("OK",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
result.confirm(et.getText().toString());
}
})
.setNegativeButton("Cancel",newDialogInterface.OnClickLis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 开发 笔记 17 第十三