android 瀏覽器開發實例


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;
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM