Android webView 使用方法

fmms 12年前發布 | 70K 次閱讀 Android Android開發 移動開發
一個WebView的簡單例子 。
在開發過程中應該注意幾點: 
    1.AndroidManifest.xml中必須使用許可"android.permission.INTERNET",否則會出Web page not available錯誤。
    2.如果訪問的頁面中有Javascript,則webview必須設置支持Javascript。
        webview.getSettings().setJavaScriptEnabled(true);  
    3.如果頁面中鏈接,如果希望點擊鏈接繼續在當前browser中響應,而不是新開Android的系統browser中響應該鏈接,必須覆蓋 webview的WebViewClient對象。
mWebView.setWebViewClient(new WebViewClient(){        
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {        
                        view.loadUrl(url);        
                        return true;        
                    }        
        });   
mWebView.setWebViewClient(new WebViewClient(){     
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {     
                        view.loadUrl(url);     
                        return true;     
                    }     
        }); 
 4.如果不做任何處理,瀏覽網頁,點擊系統“Back”鍵,整個Browser會調用finish()而結束自身,如果希望瀏覽的網 頁回退而不是推出瀏覽器,需要在當前Activity中處理并消費掉該Back事件。
public boolean onKeyDown(int keyCode, KeyEvent event) {        
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {        
            mWebView.goBack();        
                   return true;        
        }        
        return super.onKeyDown(keyCode, event);        
    }     
public boolean onKeyDown(int keyCode, KeyEvent event) {     
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {     
            mWebView.goBack();     
                   return true;     
        }     
        return super.onKeyDown(keyCode, event);     
    }   
下一步讓我們來了解一下android中webview是如何支持javascripte自定義對象的,在w3c標準中js有 window,history,document等標準對象,同樣我們可以在開發瀏覽器時自己定義我們的對象調用手機系統功能來處理,這樣使用js就可以 為所欲為了。
  看一個實例:
 
public class WebViewDemo extends Activity {         
    private WebView mWebView;        
    private Handler mHandler = new Handler();        
    public void onCreate(Bundle icicle) {        
        super.onCreate(icicle);        
        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()");        
                    }        
                });        
            }        
        }, "demo");        
        mWebView.loadUrl("file:///android_asset/demo.html");        
    }        
}   
public class WebViewDemo extends Activity {      
    private WebView mWebView;     
    private Handler mHandler = new Handler();     
    public void onCreate(Bundle icicle) {     
        super.onCreate(icicle);     
        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()");     
                    }     
                });     
            }     
        }, "demo");     
        mWebView.loadUrl("file:///android_asset/demo.html");     
    }     
} 
我們看addJavascriptInterface(Object obj,String interfaceName)這個方法,該方法將一個java對象綁定到一個javascript對象中,javascript對象名就是 interfaceName(demo),作用域是Global。這樣初始化webview后,在webview加載的頁面中就可以直接通過 javascript:window.demo訪問到綁定的java對象了。來看看在html中是怎樣調用的。
<html>        
        <mce:script language="javascript"><!--      
                function wave() {        
                    document.getElementById("droid").src="android_waving.png";        
                }        
// --></mce:script>        
        <body>        
            <a onClick="window.demo.clickOnAndroid()">        
                                <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>        
                                Click me!        
            </a>        
        </body>        
</html>      
<html>     
        <mce:script language="javascript"><!--   
                function wave() {     
                    document.getElementById("droid").src="android_waving.png";     
                }     
// --></mce:script>     
        <body>     
            <a onClick="window.demo.clickOnAndroid()">     
                                <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>     
                                Click me!     
            </a>     
        </body>     
</html>    
這樣在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的目的。
總結:
1、添加權限:AndroidManifest.xml中必須使用許可"android.permission.INTERNET",否則會出Web page not available錯誤。
    2、在要Activity中生成一個WebView組件:WebView webView = new WebView(this);
    3、設置WebView基本信息:
          如果訪問的頁面中有Javascript,則webview必須設置支持Javascript。
          webview.getSettings().setJavaScriptEnabled(true);  
          觸摸焦點起作用
          requestFocus();
          取消滾動條
          this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
    4、設置WevView要顯示的網頁:
          互聯網用:webView.loadUrl("http://www.google.com"); 
          本地文件用:webView.loadUrl("file:///android_asset/XX.html");  本地文件存放在:assets文件中
    5、如果希望點擊鏈接由自己處理,而不是新開Android的系統browser中響應該鏈接。
          給WebView添加一個事件監聽對象(WebViewClient)      
          并重寫其中的一些方法
                shouldOverrideUrlLoading:對網頁中超鏈接按鈕的響應。
                                          當按下某個連接時WebViewClient會調用這個方法,并傳遞參數:按下的url 
                onLoadResource   
                onPageStart  
                onPageFinish  
                onReceiveError
                onReceivedHttpAuthRequest
    6、如果用webview點鏈接看了很多頁以后,如果不做任何處理,點擊系統“Back”鍵,整個瀏覽器會調用finish()而結束自身,如果希望瀏覽的網頁回退而不是退出瀏覽器,需要在當前Activity中處理并消費掉該Back事件。
       覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。
  public boolean onKeyDown(int keyCoder,KeyEvent event){
                        if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
                                webview.goBack();   //goBack()表示返回webView的上一頁面
                                return true;
                        }
                        return false;
                }
 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!