編輯:Android開發實例
如果訪問的頁面中有Javascript,則webview必須設置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
我 們來了解一下android中webview是如何支持javascripte自定義對象的,在w3c標准中js有 window,history,document等標准對象,同樣我們可以在開發浏覽器時自己定義我們的對象調用手機系統功能來處理,這樣使用js就可以 為所欲為了。
- package com.teleca.robin;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.util.Log;
- import android.webkit.WebSettings;
- import android.webkit.WebView;
- public class WebViewDemoActivity extends Activity {
- /** Called when the activity is first created. */
- final static String tag="robin";
- WebView mWebView;
- Handler mHandler=new Handler();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.webviewdemo);
- mWebView = (WebView) findViewById(R.id.webView);
- WebSettings webSettings = mWebView.getSettings();
- webSettings.setJavaScriptEnabled(true);
- mWebView.addJavascriptInterface(new Object() {
- public void clickOnAndroid() {
- mHandler.post(new Runnable() {
- public void run() {
- mWebView.loadUrl("javascript:wave()");
- Log.i(tag,"clickOnAndroid");
- }
- });
- }
- }, "demo");
- mWebView.loadUrl("file:///android_asset/demo.html");
- }
- }
ssets\demo.html文件
- <html>
- <script language="javascript">
- <!--
- function wave() {
- document.getElementById("droid").src="android_wave.png";
- }
- //-->
- </script>
- <body>
- <a onClick="window.demo.clickOnAndroid()">
- <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>
- Hello,are you all right?
- </a>
- </body>
- </html>
我 們看addJavascriptInterface(Object obj,String interfaceName)這個方法,該方法將一個java對象綁定到一個javascript對象中,javascript對象名就是 “demo”,作用域是Global。這樣初始化webview後,在webview加載的頁面中就可以直接通過 javascript:window.demo訪問到綁定的java對象了。
這樣在javascript中就可以調用java對象的clickOnAndroid()方法了,同樣我們可以在此對象中定義很多方法(比 如發短信,調用聯系人列表等手機系統功能。),這裡wave()方法是java中調用javascript的例子。
這裡還有幾個知識點:
1) 為了讓WebView從apk文件中加載assets,Android SDK提供了一個schema,前綴為"file:///android_asset/"。WebView遇到這樣的schema,就去當前包中的 assets目錄中找內容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要綁定的Java對象及方法不要直接在裡面運行,這裡是使用 Handler來進行的。
程序英文原址:http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/
我對其進行了修改,並加了簡單的注釋,這個例子的不僅是對js的操作,它還對android浏覽器做了簡單的介紹,
這些我會在注釋中一一講解。
Javascript彈出框有如下三種:
JavaScript代碼如下:
alert(); 或alert("alert");
window.confirm("Are you srue?");
window.prompt("Please input some word";,"this is text");
WebChromeClient 中對三種dialog進行了捕捉,但不幸的是,並沒有回調函數可以使用, 或者說不能獲得用戶是點擊“OK”還是“CANCEL”的操作結果。
個人以為,這些方法的設置是為了對一些涉及到html操作的應用程序進行測試時使用的。
在WebChromeClient中還有以下的方法:
Java代碼
onProgressChanged(WebView view, int newProgress);
onReceivedIcon(WebView view, Bitmap icon);
onReceivedTitle(WebView view, String title);
onRequestFocus(WebView view);
onCloseWindow(WebView window);
onProgressChanged(WebView view, int newProgress)
這些方法的使用我會在以後的博文中講到.
請大家先看今天講解的重點
WebViewDemo2Activity.java文件
demo2.html文件
- package com.teleca.robin;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.DialogInterface;
- import android.os.Bundle;
- import android.os.Handler;
- import android.util.Log;
- import android.webkit.JsPromptResult;
- import android.webkit.JsResult;
- import android.webkit.WebChromeClient;
- import android.webkit.WebSettings;
- import android.webkit.WebView;
- import android.widget.TextView;
- public class WebViewDemo2Activity extends Activity {
- /** Called when the activity is first created. */
- final static String tag="robin";
- WebView mWebView;
- Handler mHandler=new Handler();
- TextView mReusultText;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.webviewdemo2);
- mReusultText = (TextView) findViewById(R.id.textView);
- mWebView = (WebView) findViewById(R.id.webView);
- WebSettings webSettings = mWebView.getSettings();
- mWebView.setWebChromeClient(new MyWebChromeClient());
- webSettings.setJavaScriptEnabled(true);
- mWebView.loadUrl("file:///android_asset/demo2.html");
- }
- /**
- * 繼承WebChromeClient類
- * 對js彈出框時間進行處理
- *
- */
- final class MyWebChromeClient extends WebChromeClient {
- /**
- * 處理alert彈出框
- */
- @Override
- public boolean onJsAlert(WebView view,String url, String message,JsResult result) {
- Log.d(tag,"onJsAlert:"+message);
- mReusultText.setText("Alert:"+message);
- //對alert的簡單封裝
- new AlertDialog.Builder(WebViewDemo2Activity.this).
- setTitle("Alert").setMessage(message).setPositiveButton("OK",
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface arg0, int arg1) {
- //TODO
- }
- }).create().show();
- result.confirm();
- return true;
- }
- /**
- * 處理confirm彈出框
- */
- @Override
- public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
- Log.d(tag, "onJsConfirm:"+message);
- mReusultText.setText("Confirm:"+message);
- result.confirm();
- return super.onJsConfirm(view, url, message, result);
- }
- /**
- * 處理prompt彈出框
- */
- @Override
- public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
- Log.d(tag,"onJsPrompt:"+message);
- mReusultText.setText("Prompt input is :"+message);
- result.confirm();
- return super.onJsPrompt(view, url, message, message, result);
- }
- }
- }
- <html>
- <script language="javascript">
- <!--
- function doAlert() {
- alert("alert");
- }
- function doConfirm() {
- window.confirm("Are you srue?")
- }
- function doPrompt() {
- window.prompt("Please input some word","this is text");
- }
- //-->
- </script>
- <body>
- <a onClick="doAlert()">
- alert("this is a alert")
- </a>
- <br>
- <a onClick="doConfirm()">
- window.confirm("Are you srue?")
- </a>
- <br>
- <a onClick="doPrompt()">
- window.prompt("Please input some word","this is text")
- </a>
- <br>
- </body>
- </html>
Android Service是分為兩種: 本地服務(Local Service): 同一個apk內被調用 遠程服務(Remote Service):被另一個
大家好,眾所周知,android裡兩個相同方向的ScrollView是不能嵌套的,那要是有這樣的需求怎麼辦?(這個需求一般都是不懂android的人提出來的)難道
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩