android web view的学习 2 通过WebChomeClient 实现进度条和title,通过WebViewClient 来进行url的拦截,和javascript的交互
来源:互联网 发布:新闻类网站 数据库 编辑:程序博客网 时间:2024/06/11 18:50
android webview demo
WebView 包含了浏览网页功能空间
WebViewClient WebView 网页加载的处理器,例如加载开始,加载结束
WebChromeClient:侧重于WebView 处理界面部分的功能,例如显示进度条,对话框,标题
WebSettings,WebView的设置
JS的支持,类和注解
PS: 如果需要设置缩放比例:webview.setInitialScale(150);
webView 设置缩放比例
首先自定义一个接口,
package com.example.administrator.webviewdemo;/** * Created by Administrator on 2016/8/18. */public interface WebSupport { void updateProgress(int progress); void updateTitle(String title);}
自定义一个MyWebChromeClient,
package com.example.administrator.webviewdemo;import android.webkit.WebChromeClient;import android.webkit.WebView;/** * Created by Administrator on 2016/8/18. */public class MyWebChromeClient extends WebChromeClient { WebSupport webSupport; public MyWebChromeClient(WebSupport webSupport) { this.webSupport = webSupport; } @Override public void onProgressChanged(WebView view, int newProgress) { //super.onProgressChanged(view, newProgress); webSupport.updateProgress(newProgress); } @Override public void onReceivedTitle(WebView view, String title) {// super.onReceivedTitle(view, title); webSupport.updateTitle(title); }}
拦截特定的url
自定义WebViewClient,
package com.example.administrator.webviewdemo;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.util.Log;import android.webkit.WebResourceRequest;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;import java.net.MalformedURLException;import java.net.URL;/** * Created by Administrator on 2016/8/18. */public class MyWebViewClient extends WebViewClient { Context context; public MyWebViewClient(Context context) { this.context = context; } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return super.shouldOverrideUrlLoading(view, request); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { boolean ret = super.shouldOverrideUrlLoading(view, url); if(url.indexOf("58.com")>0) { ret = true; try { URL u = new URL(url); Log.d("kodulf", "login"); view.loadUrl("http://www.ganji.com"); } catch (MalformedURLException e) { e.printStackTrace(); } }else if(url.startsWith("tel:")){ Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse(url)); context.startActivity(intent); ret = true; }else if(url.startsWith("smsto://")){ Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse(url)); context.startActivity(intent); ret = true; } return ret; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); }}
与javaScipt的交互:
在我们的main的文件夹下面,创建一个assets的文件夹,然后创建一个index.html的文件
<html><head> <script type="application/javascript"> //1.创建方法,有一个js 要调用必须要有JavaScriptInterface function callAndroid(msg){ //调用Android 代码 //window内部的对象都是有WebView(WebKit)来创建的 //如果使用WebView addJavaScriptInterface(Object,String) //调用的这个方法,就能够将Object 对象,添加到JS的window中 //引用的时候,使用String 参数的内容作为对象名 //如果string=“hello” 那么就可以调用window.hello //本例,使用Android window.Android.showToast(msg); } function exitApp(){ window.Android.exitApp(); } //获取Java内部的数据,只要Java 方法,返回字符串就可以了 //获取当前的手机的类型 function getDevice(){ //var device = window.Android.getDevice(); //document.write("phone type="+device); document.write("phone type="+"hello"); } </script></head><body><a href="http://m.58.com">跳到58</a><a href="tel://13391531070">打电话</a><a href="smsto://13391531070">发短息</a><button title="js 吐司" value="js 吐司" onclick="callAndroid('toast')">click me and Toast</button><button title="退出" value="退出" onclick="exitApp()">点击退出</button><button title="获取手机类型" value="获取手机类型" onclick="getDevice()">获取手机类型,通过Android来获取,然后设置到js中</button></body></html>
创建一个接口:
package com.example.administrator.webviewdemo;import android.content.Context;import android.os.Build;import android.webkit.JavascriptInterface;import android.widget.Toast;/** * Created by Administrator on 2016/8/18. */public class JsSupport { public Context context; public JsSupport(Context context) { this.context = context; } //TODO 一定一定要记住了,方法要是注解,并且是public 的不然是不能够被调用到的,而且会报错:Uncaught TypeError: window @JavascriptInterface public void showToast(String msg){ if(msg!=null){ Toast.makeText(context,msg,Toast.LENGTH_LONG).show(); } } //TODO 一定一定要记住了,方法要是注解,并且是public 的不然是不能够被调用到的,而且会报错:Uncaught TypeError: window @JavascriptInterface public void exitApp(){ System.exit(0); } //TODO 一定一定要记住了,方法要是注解,并且是public 的不然是不能够被调用到的,而且会报错:Uncaught TypeError: window @JavascriptInterface public String getDevice(){ return Build.DEVICE; }}
MainActivity:
package com.example.administrator.webviewdemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.ProgressBar;import java.net.MalformedURLException;import java.net.URL;////public class MainActivity extends AppCompatActivity {//// @Override// protected void onCreate(Bundle savedInstanceState) {// super.onCreate(savedInstanceState);// setContentView(R.layout.activity_main);// WebView webView = (WebView)findViewById(R.id.webView);// //必须要设置loadUrl里面的是http 开头的// //webView.setWebViewClient(new WebViewClient());// //webView.loadUrl("http://www.baidu.com");// //// //String data ="<html><body>我是网页</br><img width=800 src=\"http://www.pptbz.com/pptpic/UploadFiles_6909/201204/2012041411433867.jpg\"/></body></html>";// String data ="<html><head><style>img{width:50% height =50%}</style></head><body>我是网页</br><img src=\"http://www.pptbz.com/pptpic/UploadFiles_6909/201204/2012041411433867.jpg\"/></body></html>";// webView.loadData(// data,// "text/html;charset=UTF-8",// null// );//// //webView图片显示的问题,需要进行适配,需要客户端和服务器人员一起开发,服务器中的网页,不允许有尺寸。客户端需要使用css 控制图片的尺寸// //通用规则,服务器返回的html 只是片段,没有《html》《body》《/body》</html> 只有内容,客户端需要手动的添加图片屏幕适配的内容// //使用css来控制所有图片的适配;使用style 标签来定义图片的样式// }//}public class MainActivity extends AppCompatActivity implements WebSupport { /** WebView 包含了浏览网页功能空间 WebViewClient WebView 网页加载的处理器,例如加载开始,加载结束 WebChromeClient:侧重于WebView 处理界面部分的功能,例如显示进度条,对话框,标题 WebSettings,WebView的设置 JS的支持,类和注解 */ private WebView webView; private ProgressBar progressbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webView); progressbar=(ProgressBar)findViewById(R.id.progressbar); progressbar.setMax(100); //如果是上面的直接loadUrl的话,会调用我们系统的浏览器去打开上面的网址,有了下面的webviewclient的设置,会在我们的应用中打开// webView.setWebViewClient(new WebViewClient(){// @Override// public boolean shouldOverrideUrlLoading(WebView view, String url) {// view.loadUrl(url);// //return super.shouldOverrideUrlLoading(view, url);// return true;// }// }); webView.setWebViewClient(new MyWebViewClient(this)); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); //settings.setTextZoom(150); settings.setDisplayZoomControls(true); settings.setDefaultFontSize(32);// webView.setWebChromeClient(new WebChromeClient(){// @Override// public void onProgressChanged(WebView view, int newProgress) {// super.onProgressChanged(view, newProgress);// Log.d("kodulf","当前的进度"+newProgress);//// }// }); webView.setWebChromeClient(new MyWebChromeClient(this)); //开启Js调用java代码的功能 //参数2,就是添加JS 中的window内部的对象 // webView.addJavascriptInterface(new JsSupport(this),"Android"); //有两种方法,一种是直接的loadUrl,另一种是加载源码 //webView.loadUrl("http://m.58.com");//注意了,这里如果输入www.baidu.com的话有可能就打不开了 //我们将网页放在assets的目录下面,记住了 //TODO 记住了file .后面是三个/// 然后路径名是android_asset webView.loadUrl("file:///android_asset/index.html"); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //return super.onKeyDown(keyCode, event); if(keyCode== KeyEvent.KEYCODE_BACK){ if(webView.canGoBack()){ webView.goBack(); return true; }else{ System.exit(0);//推出程序 } } return super.onKeyDown(keyCode, event); } @Override public void updateProgress(int progress) { progressbar.setProgress(progress); } @Override public void updateTitle(String title) { setTitle(title); }}
0 0
- android web view的学习 2 通过WebChomeClient 实现进度条和title,通过WebViewClient 来进行url的拦截,和javascript的交互
- Handlebars 通过JavaScript对view和data的分离来快速构建Web模板
- 获取web view当前的URL和title
- Android通过使用webview实现和js的交互
- Android 通过WebView和js的交互
- 要是 IOS 开发的哥们告诉大家说webview 和 本地交互只能通过 “拦截Url” 的方式。。。
- 通过Flash和c++的交互来实现自己的桌面游戏
- 通过Flash和c++的交互来实现自己的桌面游戏
- FLEX和java web通过blazeds交互信息的实例
- 通过WinSCP来进行win和linux的双向传输
- Linux的内核空间和用户空间通过内存共享来进行通信的实现
- Linux的内核空间和用户空间通过内存共享来进行通信的实现
- 通过webView与javascript交互来研究webView的特点
- android view的宽高通过代码进行设置---dp和sp之间互转
- 通过SecureCRT实现window和linux的编译交互
- 如何通过xshell实现Win和linux的交互
- 我的Android进阶之旅------>Android如何通过自定义SeekBar来实现视频播放进度条
- (转)Android 通过WebView和js的交互
- 【NOIP2014】生活大爆炸版石头剪刀布
- 博文生涯的hello world
- React-Native学习十八:Navigator
- CPU亲和性(affinity)及与亲和性有关的两个函数 sched_setaffinity()和 sched_getaffinity()
- hashCode方法的作用----java判断来年各个元素是否重复的机制
- android web view的学习 2 通过WebChomeClient 实现进度条和title,通过WebViewClient 来进行url的拦截,和javascript的交互
- 线段树(3)之区间合并(基础题)
- 展示不全:fill_parent与写死高度
- glib-compile-schemas not found
- java集合之List
- php中一个神奇的函数extract
- Adroid之SqliteDatabase学习笔记
- POJ 2395--Out of Hay
- java集合之Set