bootstrap easyui RunJS JSFiddle codepen Gist

利用HTML5开发Android(2)---Android中构建HTML5应用

使用WebView控件 与其他控件的使用方法相同 在layout中使用一个<WebView>标签

WebView不包括导航栏,地址栏等完整浏览器功能,只用于显示一个网页

在WebView中加载Web页面,使用loadUrl()

1 WebView myWebView = (WebView) findViewById(R.id.webview);   
2 myWebView.loadUrl("http://www.example.com");  
View Code

注意在manifest文件中加入访问互联网的权限:

Xml代码  
1 <uses-permission android:name="android.permission.INTERNET" />  
View Code
在Android中点击一个链接,默认是调用应用程序来启动,因此WebView需要代为处理这个动作 通过WebViewClient
Java代码  
 1 //设置WebViewClient   
 2 webView.setWebViewClient(new WebViewClient(){      
 3     public boolean shouldOverrideUrlLoading(WebView view, String url) {      
 4         view.loadUrl(url);      
 5         return true;      
 6     }     
 7     public void onPageFinished(WebView view, String url) {   
 8             super.onPageFinished(view, url);   
 9     }   
10     public void onPageStarted(WebView view, String url, Bitmap favicon) {   
11         super.onPageStarted(view, url, favicon);   
12     }   
13 });  
View Code
这个WebViewClient对象是可以自己扩展的,例如
Java代码
private class MyWebViewClient extends WebViewClient {   
    public boolean shouldOverrideUrlLoading(WebView view, String url) {   
        if (Uri.parse(url).getHost().equals("www.example.com")) {   
            return false;   
        }   
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));   
    startActivity(intent);   
    return true;   
    }   
}  
View Code
之后:
Java代码 
1 WebView myWebView = (WebView) findViewById(R.id.webview);   
2 myWebView.setWebViewClient(new MyWebViewClient());  

另外出于用户习惯上的考虑 需要将WebView表现得更像一个浏览器,也就是需要可以回退历史记录

因此需要覆盖系统的回退键 goBack,goForward可向前向后浏览历史页面

Java代码  
1 public boolean onKeyDown(int keyCode, KeyEvent event) {   
2     if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack() {   
3         myWebView.goBack();   
4         return true;   
5     }   
6     return super.onKeyDown(keyCode, event);   
7 }  

Java代码

1 WebView myWebView = (WebView) findViewById(R.id.webview);   
2 WebSettings webSettings = myWebView.getSettings();   
3 webSettings.setJavaScriptEnabled(true);  
(这里的webSetting用处非常大 可以开启很多设置 在之后的本地存储,地理位置等之中都会使用到)
1 在JS中调用Android的函数方法
首先 需要在Android程序中建立接口
Java代码
 1 final class InJavaScript {   
 2        public void runOnAndroidJavaScript(final String str) {   
 3         handler.post(new Runnable() {   
 4                public void run() {    
 5                    TextView show = (TextView) findViewById(R.id.textview);   
 6                    show.setText(str);   
 7                }   
 8            });   
 9        }   
10    }  

Java代码

1 /把本类的一个实例添加到js的全局对象window中,   
2 //这样就可以使用windows.injs来调用它的方法   
3 webView.addJavascriptInterface(new InJavaScript(), "injs");  
在JavaScript中调用
Js代码
1 function sendToAndroid(){   
2         var str = "Cookie call the Android method from js";   
3         windows.injs.runOnAndroidJavaScript(str);//调用android的函数   
4 }   
2 在Android中调用JS的方法
 
JS中的方法
Js代码
1 function getFromAndroid(str){   
2         document.getElementByIdx_x_x_x("android").innerHTML=str;   
3 }  
Android调用该方法
Java代码
1 Button button = (Button) findViewById(R.id.button);   
2        button.setOnClickListener(new OnClickListener() {   
3        public void onClick(View arg0) {   
4             //调用javascript中的方法   
5            webView.loadUrl("javascript:getFromAndroid('Cookie call the js function from Android')");   
6        }   
7    });  
3 Android中处理JS的警告,对话框等
在Android中处理JS的警告,对话框等需要对WebView设置WebChromeClient对象
Java代码  
 1 //设置WebChromeClient   
 2 webView.setWebChromeClient(new WebChromeClient(){   
 3     //处理javascript中的alert   
 4     public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {   
 5         //构建一个Builder来显示网页中的对话框   
 6         Builder builder = new Builder(MainActivity.this);   
 7         builder.setTitle("Alert");   
 8         builder.setMessage(message);   
 9         builder.setPositiveButton(android.R.string.ok,   
10             new AlertDialog.OnClickListener() {   
11                 public void onClick(DialogInterface dialog, int which) {   
12                     result.confirm();   
13                 }   
14             });   
15         builder.setCancelable(false);   
16         builder.create();   
17         builder.show();   
18         return true;   
19     };   
20     //处理javascript中的confirm   
21     public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {   
22         Builder builder = new Builder(MainActivity.this);   
23         builder.setTitle("confirm");   
24         builder.setMessage(message);   
25         builder.setPositiveButton(android.R.string.ok,   
26             new AlertDialog.OnClickListener() {   
27                 public void onClick(DialogInterface dialog, int which) {   
28                     result.confirm();   
29                 }   
30             });   
31         builder.setNegativeButton(android.R.string.cancel,   
32             new DialogInterface.OnClickListener() {   
33                 public void onClick(DialogInterface dialog, int which) {   
34                     result.cancel();   
35                 }   
36             });   
37         builder.setCancelable(false);   
38         builder.create();   
39         builder.show();   
40         return true;   
41     };   
42            
43     @Override  
44     //设置网页加载的进度条   
45     public void onProgressChanged(WebView view, int newProgress) {   
46         MainActivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress * 100);   
47         super.onProgressChanged(view, newProgress);   
48     }   
49   
50     //设置应用程序的标题title   
51     public void onReceivedTitle(WebView view, String title) {   
52         MainActivity.this.setTitle(title);   
53         super.onReceivedTitle(view, title);   
54     }   
55 });  
posted @ 2014-09-21 12:46  lvyafei  阅读(414)  评论(0编辑  收藏  举报
博客地址:lvyafei 返回顶部   返回顶部   返回顶部 站长QQ,点击这里给我发消息
无觅关联推荐,快速提升流量