最近看android資料,隨手寫了個簡單手機瀏覽器應用,該應用很簡單,主要包括AutoCompleteTextView 、WebView、Button控制項,但是涉及到了很多android開發常識,例如:許可權管理、布局標題列狀態列隱藏、開闢線程監聽事件、子線程不能更新主線程UI等,下面介紹一下程式碼範例:
1,修改AndroidManifest.xml檔案,首先添加上網和應用旋轉許可權, 如下:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.SET_ORIENTATION"/>
在此也可以添加如下代碼使應用全屏,即隱藏狀態列和標題列
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
2, xml布局代碼如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <AutoCompleteTextView android:id="@+id/url" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/url" android:inputType="textUri" android:completionHint="@string/url" android:completionThreshold="1" /> <WebView android:id="@+id/show" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/btnLayout" android:layout_below="@+id/url" /> <LinearLayout android:id="@+id/btnLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:orientation="horizontal" > <Button android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0" android:text="@string/back" /> <Button android:id="@+id/forward" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0" android:text="@string/forward" /> <Button android:id="@+id/refresh" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0" android:text="@string/refresh" /> <Button android:id="@+id/home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0" android:text="@string/home" /> </LinearLayout></RelativeLayout>
布局設計中要注意實現適應螢幕。
3, java代碼
package com.example.webbrowser;import java.util.Timer;import java.util.TimerTask;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.app.Activity;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.KeyEvent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.Button;import android.widget.Toast;public class WebBrowser extends Activity {AutoCompleteTextView url;WebView show;String[] booksArray = new String[]{"http://maps.google.com","http://maps.baidu.com","http://qq.com","www.baidu.com","www.163.com"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_browser); final Activity activity = this; show = (WebView)findViewById(R.id.show); show.getSettings().setJavaScriptEnabled(true); show.getSettings().setBuiltInZoomControls(true); //show.getSettings().setDisplayZoomControls(false); show.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String strUrl) { view.loadUrl(strUrl); url.setText(strUrl); return false; } public void onPageStarted(WebView view, String strUrl, Bitmap favicon) { super.onPageStarted(view, strUrl, favicon); url.setText(strUrl); } public void onPageFinished(WebView view, String strUrl) { } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } }); url = (AutoCompleteTextView)findViewById(R.id.url); ArrayAdapter<String> aa = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, booksArray); url.setAdapter(aa); url.setOnKeyListener(new View.OnKeyListener() {public boolean onKey(View v, int keyCode, KeyEvent ev) {if (keyCode == KeyEvent.KEYCODE_ENTER){ String strUrl = url.getText().toString(); Pattern p = Pattern.compile("http://([\\w-]+\\.)+[\\w-]+(/[\\w-\\./?%=]*)?");Matcher m = p.matcher(strUrl);if (!m.find()){strUrl = "http://" + strUrl;} show.loadUrl(strUrl); return true;}return false;}}); // button final Button backBtn = (Button)findViewById(R.id.back); final Button forwardBtn = (Button)findViewById(R.id.forward); Button refreshBtn = (Button)findViewById(R.id.refresh); Button homeBtn = (Button)findViewById(R.id.home); backBtn.setEnabled(false); forwardBtn.setEnabled(false); backBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { show.goBack(); } }); forwardBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO show.goForward(); } }); refreshBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO String strUrl = url.getText().toString(); show.loadUrl(strUrl); } }); homeBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO show.loadUrl("http://maps.google.com"); } }); final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x1111) { // whether can go back if (show.canGoBack()) { backBtn.setEnabled(true); } else { backBtn.setEnabled(false); } // whether can go forward if (show.canGoForward()) { forwardBtn.setEnabled(true); } else { forwardBtn.setEnabled(false); } } super.handleMessage(msg); } }; // create thread to change button states new Timer().schedule(new TimerTask() { public void run() { Message msg = new Message(); msg.what = 0x1111; handler.sendMessage(msg); } }, 0, 100); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Check if the key event was the Back button and if there's history if ((keyCode == KeyEvent.KEYCODE_BACK) && show.canGoBack()) { show.goBack(); return true; } // If it wasn't the Back key or there's no web page history, bubble up to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_web_browser, menu); return true; }}
除了AutoCompleteTextView輸入URL和WebView顯示網頁內容外,應用底部有四個Button分別實現後退、前進、重新整理、首頁(暫未實現)等功能,到此就可以在android手機上使用自己的瀏覽器了。
4,應用: