• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android WebView应用

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0727/583.html

 
 
本文常州微信公众平台要紧对WebView进行先容,包含webView 4个可以定制的点、配置WebView back键相应、掌握网络的链接仍在webView中跳转、表现页面加载进度、处分https要求、行使addJavascriptInterface实现android程序和javascript交互等等
 
 
 
WebView基于webkit引擎展现web页面的控件,应用前必要在Android Manifest file中配置internet走访权限,否则提醒页面无法走访
 
 
 
Xml代码 
 
<uses-permission android:name="android.permission.INTERNET" /> 
 
 
 
<uses-permission android:name="android.permission.INTERNET" />WebView控件功效壮大,除了具备普通View的属性和配置外,还可以对url要求、页面加载、渲染、页面交互进行壮大的处分。
 
 
 
WebView有几个可以定制的点:
 
 
 
(1)配置WebChromeClient子类,WebChromeClient会在少许影响涉猎器ui交互动作产生时被挪用,好比WebView关闭和潜藏、页面加载进展、js确认框和警告框、js加载前、js操纵超时、webView获得核心等等,详见WebChromeClient
 
 
 
 
 
 
 
(2)配置WebViewClient子类,WebViewClient会在少许影响内容喧嚷的动作产生时被挪用,好比常州微信小程序开发表单的错误提交必要从新提交、页面开始加载及加载实现、资源加载中、汲取到http认证必要处分、页面键盘相应、页面中的url翻开处分等等,详见WebViewClient
 
 
 
 
 
 
 
(3)配置WebSettings类,此中包含多项配置。WebSettings用来对WebView的配置进行配置和经管,好比是否可以进行文件操纵、缓存的配置、页面是否支持扩大和收缩、是否容许应用数据库api、字体及文字编码配置、是否容许js剧本运转、是否容许图片自动加载、是否容许数据及密码留存等等,详见WebSettings
 
 
 
 
 
 
 
(4)配置addJavascriptInterface要领,将java工具绑定到webView中,以利便从页面js中掌握java工具,实现用内陆java代码和html页面进行交互,乃至可以进行页面自动化。但云云做存在安全隐患,以是若配置了此要领,请确保webView的代码都是本人实现,详细应用addJavascriptInterface进行自动化见本文5应用addJavascriptInterface实现和js交互
 
 
 
 
 
 
 
1、back键掌握网络后退
 
 
 
Activity默认的back键处分为结束目前Activity,webView查看了良多网络后,有望按back键回笼上一次涉猎的页面,这个时候我们就必要笼盖onKeyDown函数,告诉他若何处分,如下:
 
 
 
Java代码 
 
public boolean onKeyDown(int keyCode, KeyEvent event) {  
 
    if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {  
 
        webView.goBack();  
 
        return true;  
 
    }  
 
 
 
    return super.onKeyDown(keyCode, event);  
 
 
 
 
    public boolean onKeyDown(int keyCode, KeyEvent event) {
 
        if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
 
            webView.goBack();
 
            return true;
 
        }
 
 
 
        return super.onKeyDown(keyCode, event);
 
    } 此中webView.canGoBack()在webView含有一个可后退的涉猎记录时回笼true
 
 
 
webView.goBack();表示回笼webView的前次走访页面
 
 
 
 
 
 
 
2、目前常州网站开发建设网络的链接仍在webView中跳转
 
 
 
Java代码 
 
webView.setWebViewClient(new WebViewClient() {  
 
 
 
    @Override 
 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {  
 
        view.loadUrl(url);  
 
        return true;  
 
    }  
 
}); 
 
 
 
                webView.setWebViewClient(new WebViewClient() {
 
 
 
                    @Override
 
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
 
                        view.loadUrl(url);
 
                        return true;
 
                    }
 
                }); shouldOverrideUrlLoading表示目前webView中的一个新url必要加载时,给目前运用程序一个处分时机,要是没有重写此函数,webView要求ActivityManage选定合适的体例处分要求,就像弹出uc和互联网让用户选定涉猎器同样。重写后return true表示让目前程序处分,return false表示让目前webView处分
 
 
 
Xml代码 
 
Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. 
 
 
 
Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url.参考:
 
 
 
https://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)
 
 
 
 
 
 
 
游戏开发运营题目阐发:
 
 
 
本日在用webView load腾讯的OAuth页面https://open.t.qq.com/cgi-bin/authorize
 
 
 
时,突然弹出选定uc照旧互联网涉猎器确凿认框,很奇怪,其余页面都能平常load,而这个却无法在webView中load,后来用火狐看了下是由于load这个页面的时候会重定向到另外一个页面https://open.t.qq.com/oauth_html/login.php?oauth_token=xxx&type=0,而webView没有配置shouldOverrideUrlLoading,招致url交给了ActivityManage去向分,注释如上,后增加后可平常load页面
 
 
 
 
 
 
 
3、页面加载进度
 
 
 
代码如下
 
 
 
Java代码 
 
webView.setWebChromeClient(new WebChromeClient() {  
 
 
 
    public void onProgressChanged(WebView view, int progress) {  
 
        setTitle("页面加载中,请稍候..." + progress + "%");  
 
        setProgress(progress * 100);  
 
 
 
        if (progress == 100) {  
 
            setTitle(R.string.app_name);  
 
        }  
 
    }  
 
}); 
 
 
 
webView.setWebChromeClient(new WebChromeClient() {
 
 
 
    public void onProgressChanged(WebView view, int progress) {
 
        setTitle("页面加载中,请稍候..." + progress + "%");
 
        setProgress(progress * 100);
 
 
 
        if (progress == 100) {
 
            setTitle(R.string.app_name);
 
        }
 
    }
 
});onProgressChanged关照运用程序目前页面加载的进度
 
 
 
progress  表示目前页面加载的进度,为1至100的整数
 
 
 
参考:
 
 
 
https://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView, int)
 
 
 
 
 
 
 
4、处分https要求
 
 
 
webView默认常州手游开发是不处分https要求的,页面表现空缺,必要进行如下配置:
 
 
 
Java代码 
 
    webView.setWebViewClient(new WebViewClient() {  
 
 
 
        @Override 
 
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {  
 
            handler.proceed();  
 
//            handler.cancel();  
 
//            handler.handleMessage(null);  
 
        }  
 
    }); 
 
 
 
    webView.setWebViewClient(new WebViewClient() {
 
 
 
        @Override
 
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
 
            handler.proceed();
 
//            handler.cancel();
 
//            handler.handleMessage(null);
 
        }
 
    });onReceivedSslError为webView处分ssl证书配置
 
 
 
此中handler.proceed();表示守候证书相应
 
 
 
handler.cancel();表示挂起持续,为默认体例
 
 
 
handler.handleMessage(null);可做其余处分
 
 
 
参考:
 
 
 
https://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError)
 
 
 
 
 
 
 
5、应用addJavascriptInterface实现和js交互
 
 
 
5.1 javascript中挪用java工具及要领
 
 
 
配置webView的addJavascriptInterface要领,该要领有两个参数,第一个参数为被绑定到js中的类实例,第二个参数为在js中暴露的种又名,在js中引用java工具即是用这个名字
 
 
 
Java代码 
 
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();  
 
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");  
 
 
 
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();
 
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs"); 
 
 
 
实现绑定到js的类,此中的javaMethod要领我们将在页眼前端js中挪用,用于回笼一段内容。showHtml用来应用AlertDialog表现一段html代码,稍后将应用到
 
 
 
Java代码 
 
private class ClassBeBindedToJS{  
 
    public void showHtml(String html){  
 
         new AlertDialog.Builder(UpdateStatusActivity.this)   
 
                     .setTitle("HTML").setMessage(html)  
 
                     .setPositiveButton(android.R.string.ok, null)  
 
                     .setCancelable(false).create().show();  
 
    }  
 
    public String javaMethod() {  
 
        return "use java method";  
 
    }  
 
}; 
 
 
 
private class ClassBeBindedToJS{
 
    public void showHtml(String html){
 
            new AlertDialog.Builder(UpdateStatusActivity.this)
 
                     .setTitle("HTML").setMessage(html)
 
                     .setPositiveButton(android.R.string.ok, null)
 
                     .setCancelable(false).create().show();
 
    }
 
    public String javaMethod() {
 
        return "use java method";
 
    }
 
};云云我们便在前端挪用java工具,如下:
 
 
 
Html代码 
 
<SPAN><html> 
 
    <body>          
 
        <p id="displayDiv">Test page.</p> 
 
        <input type="button" value="use java object" onclick="document.getElementById('</SPAN>displayDiv').innerHTML=classNameBeExposedInJs.javaMethod()" /> 
 
<SPAN>  </body> 
 
</html></SPAN> 
 
 
 
<html>
 
       <body>       
 
              <p id="displayDiv">Test page.</p>
 
              <input type="button" value="use java object" onclick="document.getElementById('displayDiv').innerHTML=classNameBeExposedInJs.javaMethod()" />
 
       </body>
 
</html> 这段常州游戏开发培训html感化为点击button按钮,改变p内容为java工具要领中的内容,此中classNameBeExposedInJs为java工具在js中的又名,javaMethod为java工具的要领
 
 
 
 
 
 
 
5.2 java中挪用js要领
 
 
 
用webView的loadUrl实现,好比当今我们想在页面加载实现后挪用js中的hello函数,实现如下:
 
 
 
Java代码 
 
webView.setWebViewClient(new WebViewClient() {    
 
    @Override 
 
    public void onPageFinished(WebView webView, String url){  
 
        webView.loadUrl("javascript:hello()");  
 
    }  
 
}); 
 
 
 
webView.setWebViewClient(new WebViewClient() { 
 
    @Override
 
    public void onPageFinished(WebView webView, String url){
 
        webView.loadUrl("javascript:hello()");
 
    }
 
});怎么样,很简单吧^_^,干脆loadUrl("javascript:hello()")便了
 
 
 
行使这一点我们可以很利便的实现WebView的自动化,如网络自动化登录。举个栗子,实现https://m.renren.com/ 的自动登录啊,代码如下
 
 
 
Java代码 
 
webView.getSettings().setJavaScriptEnabled(true);  
 
webView.loadUrl("https://m.renren.com");  
 
webView.requestFocus();  
 
 
 
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();  
 
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");      
 
webView.setWebViewClient(new WebViewClient() {    
 
    @Override 
 
    public void onPageFinished(WebView webView, String url){   
 
        webView.loadUrl("javascript:document.getElementsByName('email')[0].value='userName'");   
 
        webView.loadUrl("javascript:document.getElementsByName('password')[0].value='userPassword'");   
 
        webView.loadUrl("javascript:document.getElementsByName('login')[0].click()");  
 
    }  
 
}); 
 
 
 
webView.getSettings().setJavaScriptEnabled(true);
 
webView.loadUrl("https://m.renren.com");
 
webView.requestFocus();
 
 
 
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();
 
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");   
 
webView.setWebViewClient(new WebViewClient() { 
 
       @Override
 
       public void onPageFinished(WebView webView, String url){
 
              webView.loadUrl("javascript:document.getElementsByName('email')[0].value='userName'");
 
              webView.loadUrl("javascript:document.getElementsByName('password')[0].value='userPassword'");
 
              webView.loadUrl("javascript:document.getElementsByName('login')[0].click()");
 
       }
 
});从中可以看出先加载https://m.renren.com页面,在页面加载实现onPageFinished后,挪用js实现自动登录
 
 
 
此中三句js分别表示配置用户名文本框内容、配置用户密码文本框内容、点击登录按钮,云云登录胜利喽
 
 
 
 
 
 
 
5.3 java和js混用实现少许结果
 
 
 
5.3.1WebView用AlertDialog表现页面的html代码
 
 
 
以前5.1中的showHtml要领当今派上用处啦,在页面加载实现后表现页面html内容,如下:
 
 
 
Java代码 
 
webView.setWebViewClient(new WebViewClient() {    
 
    @Override 
 
    public void onPageFinished(WebView webView, String url){  
 
        webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml(document.getElementsByTagName('html')[0].innerHTML);");  
 
    }  
 
}); 
 
 
 
webView.setWebViewClient(new WebViewClient() { 
 
    @Override
 
    public void onPageFinished(WebView webView, String url){
 
        webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml(document.getElementsByTagName('html')[0].innerHTML);");
 
    }
 
}); 此中webView.loadUrl表示挪用页面中的js,而页面中的js window.classNameBeExposedInJs.showHtml挪用了程序中的java工具的要领,要领参数为一段js。
 
 
 
开始webView会执行这一段js document.getElementsByTagName('html')[0].innerHTML。含意即为获得页面中html标志的innerHTML,及网络要紧内容;
 
 
 
而后将获得的网络内容看成字符串参数传入showHtml要领
 
 
 
末了挪用showHtml函数实现,即用AlertDialog表现字符串,云云获得了全部网络的大片面html代码
 
 
 
 
 
 
 
5.3.2WebView表现目前页面的url地点
 
 
 
获得WebView目前页面url应用webView.getUrl()即可,如下:
 
 
 
Java代码 
 
webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml('" + webView.getUrl() + "');"); 
 
 
 
webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml('" + webView.getUrl() + "');");
 

上篇:上一篇:Android之RadioButton与RadioGroup基本应用
下篇:下一篇:WebView-Android与H5交互