Android WebView的使用笔记(上)
来源:互联网 发布:光伏电站数据采集器 编辑:程序博客网 时间:2024/05/17 21:34
Android WebView的使用笔记(上)
概述:
本次项目中使用到了WebView控件,踩了大量的坑,最后总算是完成了项目,但是项目中的使用还有许多有待优化的地方,所以准备静下心来,仔细总结一下WebView的用法。下文中引用了许多前辈文章中的知识点,首先webView优点如下:
1.可以打开远程URL页面,也可以加载本地HTML数据;
3.高度的定制性,可根据开发者的需要进行多样性定制。
WebView 的使用详细介绍请参考这篇系列文章
http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao
以及这篇文章
http://www.cnblogs.com/zgz345/p/3768174.html本章内容主要介绍作者在项目中用到的一些知识点
1、拦截js弹框,优化用户体验
2、url重定向
3、Java与html的相互调用
4、注意线程的调用
5、管理WebView 的生命周期
6、打印html的log信息
7、WebViewFragment
8、加载进度条
9、软键盘
10、点击返回键
下章介绍webview的缓存处理和内存泄漏等内容
1、拦截js弹框,优化用户体验 mWebView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("对话框") .setMessage(message) .setPositiveButton("确定", null); // 不需要绑定按键事件 // 屏蔽keycode等于84之类的按键 builder.setOnKeyListener(new DialogInterface.OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) { Log.v("onJsAlert", "keyCode==" + keyCode + "event="+ event); return true; } }); // 禁止响应按back键的事件 builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。 return true; } });
2、url需要重定向webView.setWebViewClient(new WebViewClient() {public boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);//在此处可以拦截某些urlreturn true;}});
3、Java与html的相互调用a/调用javascript函数 webview.loadUrl("javascript:wave()");
//获取返回值的方法
public void evaluateJavascript (String script, ValueCallback<String> resultCallback)
b/javascript调用Java mWebView.addJavascriptInterface(new MyJavaInterface(),"Android"); mWebView.getSettings().setJavaScriptEnabled(true);</span>
<span style="font-weight: normal;"> class MyJavaInterface{//注意函数要加上@android.webkit.JavascriptInterface或者@JavascriptInterface,否则调用不成功 @android.webkit.JavascriptInterface public String getStr(int i){ return "java返回的数据"+i; } @android.webkit.JavascriptInterface public void doSomeString(){//因为当前线程并不是UI线程,所以需要如下 runOnUiThread(new Runnable() { @Override public void run() { //在此处执行某些操作 } }); } }
在js中的调用:function showStr(){ return Android.getStr(5);}
4、注意线程的调用如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误
5、管理WebView 的生命周期 @Override public void onPause() { super.onPause(); mWebView.onPause(); }@Override public void onResume() { mWebView.onResume(); super.onResume(); } @Override public void onDestroy() { if (mWebView != null) { mWebView.destroy(); mWebView = null; } super.onDestroy(); }
6、打印html的log信息 mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { Log.i(TAG, "onConsoleMessage: " + consoleMessage); return super.onConsoleMessage(consoleMessage); } });
7、WebViewFragmentAndroid 自带的WebViewFragment管理了webView的生命周期,源码很简单,可以自己看一下;8、加载进度条mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { setTitle("页面加载中,请稍候..." + progress + "%"); setProgress(progress * 100);//设置进度条进度 if (progress == 100) { setTitle(R.string.app_name); progressBar.setVisibility(4); } } });
9、软键盘
加入你加载的的html页面里有输入框,那么在页面跳转的时候你最好手动先隐藏软键盘,不然用户体验会很不好
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // 隐藏软键盘 imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
如果是在fragment中,需要
<span style="font-family:KaiTi_GB2312;font-size:14px;">getActivity().getWindow().getDecorView().getWindowToken()</span>
10、处理点击返回键
public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {webView.goBack();return true;}return super.onKeyDown(keyCode, event);}
mWebView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("对话框") .setMessage(message) .setPositiveButton("确定", null); // 不需要绑定按键事件 // 屏蔽keycode等于84之类的按键 builder.setOnKeyListener(new DialogInterface.OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) { Log.v("onJsAlert", "keyCode==" + keyCode + "event="+ event); return true; } }); // 禁止响应按back键的事件 builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。 return true; } });
webView.setWebViewClient(new WebViewClient() {public boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);//在此处可以拦截某些urlreturn true;}});
webview.loadUrl("javascript:wave()");
//获取返回值的方法
b/javascript调用Javapublic void evaluateJavascript (String script, ValueCallback<String> resultCallback)
mWebView.addJavascriptInterface(new MyJavaInterface(),"Android"); mWebView.getSettings().setJavaScriptEnabled(true);</span>
<span style="font-weight: normal;"> class MyJavaInterface{//注意函数要加上@android.webkit.JavascriptInterface或者@JavascriptInterface,否则调用不成功 @android.webkit.JavascriptInterface public String getStr(int i){ return "java返回的数据"+i; } @android.webkit.JavascriptInterface public void doSomeString(){//因为当前线程并不是UI线程,所以需要如下 runOnUiThread(new Runnable() { @Override public void run() { //在此处执行某些操作 } }); } }
function showStr(){ return Android.getStr(5);}
如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误
@Override public void onPause() { super.onPause(); mWebView.onPause(); }@Override public void onResume() { mWebView.onResume(); super.onResume(); } @Override public void onDestroy() { if (mWebView != null) { mWebView.destroy(); mWebView = null; } super.onDestroy(); }
mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { Log.i(TAG, "onConsoleMessage: " + consoleMessage); return super.onConsoleMessage(consoleMessage); } });
mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { setTitle("页面加载中,请稍候..." + progress + "%"); setProgress(progress * 100);//设置进度条进度 if (progress == 100) { setTitle(R.string.app_name); progressBar.setVisibility(4); } } });
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // 隐藏软键盘 imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
如果是在fragment中,需要
<span style="font-family:KaiTi_GB2312;font-size:14px;">getActivity().getWindow().getDecorView().getWindowToken()</span>
public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {webView.goBack();return true;}return super.onKeyDown(keyCode, event);}
0 0
- Android WebView的使用笔记(上)
- Android笔记(7)---WebView的使用
- WebView使用笔记 Android
- Android WebView 使用笔记
- Android WebView使用笔记
- Android学习之笔记---WebView的使用
- Android开发学习笔记:WebView的使用
- Android笔记(一):使用WebView
- Android WebView使用笔记(一)
- Android上的WebView和ScrollView1起使用
- Android WebView 开发使用笔记
- Android应用开发之(WebView中loadData与loadDataWithBaseURL的使用上的区别)
- Android应用开发之(WebView中loadData与loadDataWithBaseURL的使用上的区别)
- Android应用开发之(WebView中loadData与loadDataWithBaseURL的使用上的区别)
- WebView的使用笔记(一)
- Android WebView的使用
- Android WebView的使用
- Android-WebView的使用
- HBase设计与开发性能优化
- Swift 字符串拼接
- SecureCRT显示中文
- 特大好消息,免费申请一年期正版Parallesl Desktop 12激活密钥
- 实现语音聊天播放自定义View
- Android WebView的使用笔记(上)
- Cache总容量计算与写回法联合使用
- Java时间判断:判断一个时间是否在一个时间段内
- PBOCEMV交易流程详解-POS与卡片的数据交互进行分析
- 设计模式--Builder模式
- Ubuntu 16.04安装Hadoop及Spark
- wempserver apache启动不了,图标显示为黄色
- ubuntu下Qt安装qwt出现的问题
- 一致性哈希