WebView 入门到注入javaScript交互

一:一个简单的webview实现

webview webview=new webview(this);
webview.getSettings.setJavaScriptEnabled(true);// 开启javascriptwebview.loadUrl("http://www.baidu.com"); //需要添加访问网络权限

二:webview加载本地资源

假如我们有一张放在assets/image文件夹下,名字是book.jpg,那么我们也可以使用webview来加载这个图片

webview.getSettings.setBuiltInZoomControls(true);//允许用户缩小或者放大内容
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
        webview.getSettings.setDisplayZoomControls(false);//当api大于11的时候,隐藏放大缩放按钮

}
webview.loadUrl("file:///android_asset/image/book.jpg");

假如我们有一个html的字符串

String html="<h1>静夜思</h1>";
webview.loadData(html, "text/html", "utf-8");

三:webview事件

1:默认情况下,没有指定webviewclient,webview会将一个url传递给activitymanager,而activitymanager则会用浏览器打开。我们只需要给

webview.setWebviewClient(new WebViewClient())

设置一个简单的webviewclient,就可以让webview自己打开url,因为其中的shouldoverrideurlloading的默认实现会简单返回false。也就是说如果不想让webview自己处理url,就返回true,这样浏览器应用程序就会处理。

2:WebViewClient简单实现

private WebViewClient mClient=new WebViewClient({
        @Override
        public boolean shouldOverrideUrlLoading(WebView view,String url){
                Uri uri=Uri.parse(url);
                if(TextUtils.equals(uri.getAuthority(),"www.google.com")){
                    //获取uri中的主机名,www.google.com就是主机名,对比两个是否一致,如果一致就继续使用webview加载
                      return false;
                }
                  //如果不是www.google.com的主机名的url,就启动浏览器加载
                return true;
        }
};

四:通过javaScript操作html

1:准备一个html

<html>
        <form name="input" action="form.html" method="get">
        Enter Email:<input type="text" id="emailAddress"/>
        <input type="submit" value="Submit"/>
        
</html>

2:注入js到html中

通过给自定义接口设置一个别名

private static final String JS_SETELEMENT="javascript:document.getElementById('%s').value='%s'";
    private static final String JS_GETELEMENT="javascript:window.BRIDGE.storeElement('%s',document.getElementById('%s').value)";
    private static final String ELEMENTID="emailAddress";
    
    //自定义的java接口
    private class MyJavaScriptInterface{
        @SuppressWarnings("unused")
        public void storeElement(String id,String element){
            SharedPreferences.Editor editor=getPreferences(Activity.MODE_PRIVATE).edit();
            editor.putString(id,element);
            editor.commit();
            if(!TextUtils.isEmpty(element)){
                Toast.makeText(context,element,Toast.LENGTH_SHORT).show();
            }
        }
    }
    
    //自定义webviewclient,当点击链接的时候,注入js保存数据,当新页面加载完成时,还注入js,取出数据。
    private WebViewClient mClient=new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView webView,Url url){
            webView.loadUrl(String.format(JS_GETELEMENT,ELEMENTID,ELEMENTID));
            return false;
        }
        
        @Override
        public void onPageFinished(WebView webView,String url){
            SharedPreferences prefs=getPreferences(Activity.MODE_PRIVATE);
            webview.loadUrl(String.format(JS_SETELEMENT,ELEMENTID,prefs.getString(ELEMENTID,""));
        }
    }
    
    private void executeJavascript(WebView view,String script){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
            view.evaluateJavascript(script,null);
        }else{
            view.loadUrl(script);
        }
    }

注,事例出自该书,有改动https://item.jd.com/11780673.html

推荐阅读更多精彩内容