最近的項目中看產品文檔的時候,發現設計文檔中”資訊”欄目設計的圖文並茂,有聲有色,感歎之余,發覺如此的布局寫起來太煩太累了…想到了平時使用浏覽器看新聞的體驗,感覺讓服務端把資訊做成網頁,客戶端使用WebView這個組件來直接訪問頁面的方式挺不錯.
WebView非常簡單,Android已經封裝的非常完善,寫個小例子覆蓋其間常用的幾個方法;
新建一個安卓項目,建議使用2.3以上SDK(因為之前版本的SDK測試一直不太好使而且沒確定原因);
首先創建個布局文件:
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <WebView
- android:id="@+id/wv1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_weight="1" />
- <WebView
- android:id="@+id/wv2"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_weight="1" />
- </LinearLayout>
然後代碼中調用並設置
Java代碼
- import android.app.Activity ;
- import android.os.Bundle ;
- import android.util.Log ;
- import android.view.KeyEvent ;
- import android.webkit.WebSettings.LayoutAlgorithm ;
- import android.webkit.WebView ;
- import android.webkit.WebViewClient ;
-
- public class WebViewDemoActivity extends Activity {
-
- private WebView m_wv1 ;
-
- private WebView m_wv2 ;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState) ;
- setContentView(R.layout.main) ;
- initView();
- }
-
- public void initView() {
- m_wv1 = (WebView)findViewById(R.id.wv1) ;
- m_wv1.getSettings().setJavaScriptEnabled(true) ;
- m_wv1.loadUrl("http://www.xuanyusong.com") ;
- //獲取WebSettings對象,設置縮放
- m_wv1.getSettings().setUseWideViewPort(true) ;
- m_wv1.getSettings().setLoadWithOverviewMode(true) ;
- m_wv1.setWebViewClient(new WebViewClient() {
-
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- Log.d("訪問網址:",url) ;
- m_wv2.loadUrl(url) ;
- return true ;
- }
- }) ;
- m_wv2 = (WebView)findViewById(R.id.wv2) ;
- //獲取WebSettings對象,設置單列
- m_wv2.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN) ;
- m_wv2.getSettings().setJavaScriptEnabled(true) ;
- m_wv2.setWebViewClient(new WebViewClient() {
-
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- Log.d("訪問網址:",url) ;
- m_wv2.loadUrl(url) ;
- return true ;
- }
- }) ;
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if((keyCode==KeyEvent.KEYCODE_BACK)&&m_wv2.canGoBack()) {
- //如果可以回退
- m_wv2.goBack() ;
- return true ;
- }
- return super.onKeyDown(keyCode,event) ;
- }
- }
最後別忘了在AndroidManifest.xml文件中添加網絡訪問權限:
XML/HTML代碼
- <uses-permission android:name="android.permission.INTERNET" />
第一個窗口中點擊鏈接會在第二個窗口中打開,點擊回退的話如果下面的WebView可以回退就會執行後退操作,如果不能則退出Activity.布局文件和代碼都可以創建WebView對象,在此使用布局直接創建,代碼創建的話構造方法有四個:
Java代碼
- WebView(Context context)
- WebView(Context context, AttributeSet attrs)
- WebView(Context context, AttributeSet attrs, int defStyle)
- WebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing)
其中loadUrl方法可以讓WebView載入指定的頁面;
如果訪問的頁面有Javascript元素,使用 setJavaScriptEnabled(true) 可設置是否支持;
getSettings()方法可以獲得當前WebView對象的WebSettings屬性,通過這個屬性可以給WebView獲取或設置樣式,比如例中設置的縮放和單列樣式,雙擊上面WebView網頁空白處可以放大該WebView;
通過setWebViewClient(WebViewClient webviewclient)方法可以設置WebView響應點擊的超鏈接,參數WebViewClient重寫其中的shouldOverrideUrlLoading方法,實現你想做的事情就可以了,在這裡面是可以拿到點擊鏈接的url的;例中WebView1的點擊會在WebView2中打開;
覆蓋onKeyDown方法是為了實現下面WebView的回退功能,否則的話會直接退出當前Activity;
還有需要注意的是,在顯示有圖片和網格的的頁面時,WebView的表現並不是很盡如人意的,這個問題大部分情況都是在服務器的頁面上動手腳,參照wap網站頁面的做法最好了.
簡單舉例最常用的幾個方法,想要深入學習和使用的話API還有很多方法。