android app需要通过手机显示网页信息还是比较常用的,比如我最近业余开发的 抢商铺游戏,需要对游戏规则做说明,规则会比较多,而且要经常变动,就想到用网页来展示,更新起来方便,不像应用,一旦发布出去,就很难更改。
言归正传,下面介绍下我对系统webview的使用,做的一个简单浏览器,无图无真像,先看看图(博客园不能传图片,等图片功能恢复了再传):
 
首先是布局文件的编辑activity_browser.xml
采用RelativeLayout布局,不知道为什么采用LinearLayout布局不行。
浏览器标题栏有三个控件,分别为Button, TextView, Button,用来执行返回,显示网页titile, 刷新操作。
在标题栏下面展示webview控件
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
      >
    
<RelativeLayout 
    android:layout_width="fill_parent"
    android:layout_height="54dp"
    android:id="@+id/title" >
    <!-- 导航栏左边按钮 -->
    <Button
        android:id="@+id/nav_left_btn"
        android:layout_width="50dip"
        android:layout_height="45dip"
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="8dp"
        android:layout_alignParentLeft="true"
        android:gravity="center"
        android:visibility="invisible" >
    </Button>
    <!-- 导航栏文字 -->
    <TextView
        android:id="@+id/nav_titile_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity=""
        android:text=""
        android:textColor="@color/white"
        android:textSize="20sp" />
    <!-- 导航栏右边按钮 -->
        <Button
        android:id="@+id/nav_right_btn"
        android:layout_width="50dip"
        android:layout_height="45dip"
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical"
         android:layout_alignParentRight="true"
        android:layout_marginRight="8dp"
        android:gravity="center"
        android:visibility="invisible" >
    </Button>
</RelativeLayout>
    
<WebView
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_below="@id/title"
  android:id="@+id/webView"/>  
</RelativeLayout>接着就是Activity的实现部分
在实现webview的时候,有2个地方要注意下
(1)如果网页是是中文,gbk编码,必须设置webview的默认编码值
webView.getSettings().setDefaultTextEncodingName("gbk");
(2)如果网页有js,必须开启js,不然显示会有问题。特别是针对html5适配的网页,我采用Jquery mobile 做的一个网页,展示就有问题。刚开始只能显示纯文本,后来开启了js执行权限,就能正常显示了。
webView.getSettings().setJavaScriptEnabled(true);
---package com.onevo.activity;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import com.onevo.R;
/**
 * 显示第tabhost 的第一个Activity,本activity 主要显示设备列表
 * 
 * @author Administrator
 * 
 */
public class BrowserActivity extends Activity 
{
  private WebView webView;
  private ProgressDialog mPgrogressDialog;
  private TextView tv_title;
  
  private Button btn_left;
  private Button btn_right;
  
  private String url = "http://114.215.171.166/level.html";
  
  public void onCreate(Bundle savedInstanceState)
  {
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_browser);
    
    //获取传递的参数
    Intent it = getIntent();
    String u = it.getStringExtra("url");
    if(!TextUtils.isEmpty(u)){
      url = u;
    }
    
    webView = (WebView) this.findViewById(R.id.webView);
    tv_title = (TextView)this.findViewById(R.id.nav_titile_textview);
    btn_left = (Button) this.findViewById(R.id.nav_left_btn);
    btn_right =  (Button) this.findViewById(R.id.nav_right_btn);
    
    btn_left.setVisibility(View.VISIBLE);
    btn_right.setVisibility(View.VISIBLE);
    btn_left.setText("返回");
    btn_right.setText("刷新");
    
    //返回事件
    btn_left.setOnClickListener(new OnClickListener()
    {
      
      @Override
      public void onClick(View v)
      {
         finish();
      }
    });
    
    //刷新事件
    btn_right.setOnClickListener(new OnClickListener()
    { 
      @Override
      public void onClick(View v)
      {
          mPgrogressDialog.show();
           webView.loadUrl(url);
      }
    });
    
    // 显示网页加载中的小菊华花
      mPgrogressDialog =  new ProgressDialog(this);
      mPgrogressDialog.setTitle("");
      mPgrogressDialog.setMessage("正在加载网页...");
      mPgrogressDialog.show();
    
      webView.getSettings().setDefaultTextEncodingName("gbk");
      
      //在线程里启动网页加载
       new Thread(new Runnable()
        {
          @Override
          public void run()
          {
             webView.loadUrl(url);
            
          }
        }).start();
 
       webView.getSettings().setJavaScriptEnabled(true);
       
       webView.setWebChromeClient(new WebChromeClient(){
        @Override
        public void onReceivedTitle(WebView view, String title)
        {
          // TODO Auto-generated method stub
          super.onReceivedTitle(view, title);
          final String tmpTitle = title;
          runOnUiThread(new Runnable()
          {
            @Override
            public void run()
            {
              tv_title.setText(tmpTitle);
            }
          });
        } 
       });
       
     webView.setWebViewClient(new WebViewClient()  
          {     
              public boolean shouldOverrideUrlLoading(WebView view, String url)   
              {     
                  view.loadUrl(url);     
                  return true;     
              }    
              @Override 
              public void onPageFinished(WebView view, String url)   
              {  
                
                  super.onPageFinished(view, url);  
                  
                  runOnUiThread(new Runnable()
          {
            
            @Override
            public void run()
            {
                mPgrogressDialog.dismiss();
            }
          });
                 
              }  
              @Override 
              public void onPageStarted(WebView view, String url, Bitmap favicon)   
              {  
                  super.onPageStarted(view, url, favicon);  
              }  
          }); 
  }
}至此,一个简单的内嵌浏览器就开发完成了。
如果用WebView点链接看了很多页以后,如果不做任何处理,点击系统返回(Back)键,整个浏览器会调用finish()方法而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
public boolean onKeyDown(int keyCode,KeyEvent event){
if(webView.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK){
webview.goBack();// goBack()表示返回webView的上一页面
return true;
}
return false;
}










