最近看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,應用截圖: