Android WebView的使用笔记(上)

来源:互联网 发布:光伏电站数据采集器 编辑:程序博客网 时间:2024/05/17 21:34

Android WebView的使用笔记(上)

概述:

             本次项目中使用到了WebView控件,踩了大量的坑,最后总算是完成了项目,但是项目中的使用还有许多有待优化的地方,所以准备静下心来,仔细总结一下WebView的用法。下文中引用了许多前辈文章中的知识点,首先webView优点如下:

1.可以打开远程URL页面,也可以加载本地HTML数据

2.可以无缝的在java和javascript之间进行交互操作;

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、WebViewFragment
Android 自带的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);}





0 0
原创粉丝点击