android web view的学习 2 通过WebChomeClient 实现进度条和title,通过WebViewClient 来进行url的拦截,和javascript的交互
2016-08-20 00:19
886 查看
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); } }
相关文章推荐
- android 通过WebView与javascript实现数据交互
- 通过WebViewJavascriptBridge实现OC与JS交互
- Android中WebView载入本地HTML代码并实现Java与JavaScript交互
- Android 利用WebViewJavascriptBridge 实现js和java的交互
- Android 利用WebViewJavascriptBridge 实现js和java的交互
- Android 利用WebViewJavascriptBridge 实现js和java的交互
- Android 利用WebViewJavascriptBridge 实现js和java的交互(一)
- Android中通过WebView控件实现与JavaScript方法相互调用的地图应用
- Android通过使用webview实现和js的交互
- Android 中利用WebViewJavascriptBridge 实现js和java的交互
- android通过HttpClient与web服务端进行数据交互
- 通过WebViewJavascriptBridge实现OC与JS交互
- 通过WebViewJavascriptBridge实现OC与JS交互
- Android WebView与JavaScript交互实现Web App
- android WebView实现java与javascript的交互
- 通过WebViewJavascriptBridge实现OC与JS交互
- 要是 IOS 开发的哥们告诉大家说webview 和 本地交互只能通过 “拦截Url” 的方式。。。
- Android 利用WebViewJavascriptBridge 实现js和java的交互
- JS调Native:(1)拦截url:WebViewClient.shouldOverrideUrlLoading (2)绑定Java对象:WebView.addJavascriptInterface
- android 中 java 和 javascript 通过webview 交互