Iwfu-安卓网络应用---WebView
2016-04-04 22:04
423 查看
WebView
类似于ImageView,WebView组件本身就是一个浏览器的实现,他的内核基于WebKit引擎,用于访问网页。 (WebKit 是一个开源的浏览器引擎,关于WebKit参见:
http://blog.csdn.net/horkychen/article/details/8629976)
Example: 基于WebView开发一个简单的浏览器
布局文件 : 一个简单按钮,一个地址输入框,一个WebView用于显示网页 ,一个ProgressBar用于显示网页加载进度.
类似于普通组件,findViewById找到WebView,按下按钮后调用webView.loadUrl(),传入EditText输入的网址,加载网页.
编码过程中出现的问题:
1-点击按钮调用webview.loadUrl()方法会调用到系统浏览器,而不是在app的webview打开网页.
2-若网页中有超链接,点击链接后不是在本app的webview中跳转,而是调用系统浏览器。
原因: webView.loadUrl()时,webView会默认给系统处理加载url的机会,若系统有浏览器则会调用系统浏览器打开网页.解决方案: 自定义类继承WebViewClient, 然后webView.setWebViewClient方法传入自定义的WebViewClient
关键代码:
//自定义WebViewClient类 private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } //设置自定义WebViewClient webView = (WebView) findViewById(R.id.webView); webView.setWebViewClient(new MyWebViewClient ());
//按钮点击事件: btn_go.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //获取地址栏输入网址 final String urlString = et_inputURL.getText().toString(); //如果以http://开头,则直接访问网页,否则加上 http://再访问网页 if (urlString.startsWith("http://")) { webView.loadUrl(urlString); return ; } else { webView.loadUrl("http://" + urlString); return; } } });
现在我们可以按下按钮就直接在本APP的WebView里打开网页了.
3-怎么实现按回退键后,webView返回上一个网页而不是退出当前APP
方法:重写onKeyDown方法@Override public boolean onKeyDown (int keyCode, KeyEvent event) { if ((keyCode==KeyEvent.KEYCODE_BACK)&&webView.canGoBack()){ webView.goBack (); //goBack表示返回上一个页面 return true; } return false; }
现在访问后按下回退键可以返回上一个网页了.
4-点击网页上的链接,按钮没反应
设置webView能使用JavaScript脚本,能与网页上的按钮链接等交互.webView.getSettings().setJavaScriptEnabled(true);
5-设置标题栏显示网页的标题(toolbar/actionbar等设置标题为网页的名字),加载完后地址栏和标题栏都随之改变
可以自定义类继承WebChromeClient,重写onReceivedTitle()方法,在加载完网页后就可以获取到webview的title然后设webView.setWebChromeClient(new MyWebChromeClient());代码如下:
@Override public void onReceivedTitle(WebView view, String title) { toolbar.setTitle (title); et_inputURL.setText(view.getUrl()); }
现在每跳转到一个新网页,标题栏的名称和地址栏的网址都会随着网页的跳转而改变。
6-如何获取加载网页的进度
依然是自定义类继承WebChromeClient,重写onProgressChanged()方法,可以配合自己的ProgressBar显示出网页加载进度.@Override public void onProgressChanged(WebView view, int newProgress) { progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(newProgress); if (newProgress == 100) { //设置加载完后隐藏progressBar progressBar.setVisibility(View.GONE); } }
此时运行,测试,无论是加载网页,还是点击网页里的链接,地址栏和标题栏都显示正常
但按下回退键后,网页返回上一级,出现新的问题。
7-按下回退键,标题栏和地址栏不会随网页变化改变,仍然显示上一级网页的地址和标题
我在onProgressChaned方法中写入了改变地址栏和状态栏的方法。即在加载网页的同时就会通知改变地址栏和状态栏代码:
private class MyWebChromeClient extends WebChromeClient { @Override public void onReceivedTitle(WebView view, String title) { //原来的改变标题栏方法就可以注释掉 // toolbar.setTitle (title); } // 显示加载进度 @Override public void onProgressChanged(WebView view, int newProgress) { toolbar.setTitle(view.getTitle());//改变标题栏 et_inputURL.setText(view.getUrl());//改变地址栏 progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(newProgress); if (newProgress == 100) { //设置加载完后隐藏progressBar progressBar.setVisibility(View.GONE); } } }
至此,一个简单的基于WebView的浏览器就完成了,效果图:
附:源码下载
http://download.csdn.net/detail/rosechan/9481082
相关文章推荐
- HTTP Status 404错误
- Intellij IDEA 创建Web项目并在Tomcat中部署运行--http://www.thinksaas.cn/group/topic/350000/
- TCP的超时重传机制与拥塞避免
- TCP/IP协议---UDP协议
- 使用Xutils(HttpUtils)请求网络数据
- 网络七层协议
- 网络流例题学习2
- android https安全连接
- android https安全连接
- android https安全连接
- android开发--android-async-http
- RTSP协议、RTMP协议、HTTP协议的区别
- mormort 土拨鼠,做后端服务那是杠杠的,基于http.sys
- 【iOS学习】十二、使用NSURLSession发送HTTP请求的问题
- stm单片机之STM32F4-Discovery资料汇总 (转载自http://blog.163.com/thinki_cao/blog/static/83944875201362493134992/)
- http 错误代码表
- Muduo网络库源码分析(二) 定时器TimeQueue,Timer,TimerId
- CodeForces - 659E New Reform (网络流)求最少的入度为0的点的个数
- TCP回射客户程序:str_cli函数
- HttpClient使用SESSIONID模拟用户发送请求