2010年1月11日星期一

為網絡視圖(WebView)補充一點導航的功能

上一篇"一個簡單的瀏覽器, 網絡視圖(WebView)"實在太簡單了, 現在為它補充一點導航的功能; 包括輸入網址, 前進,後退,重載, 當然還有退出.


Android WebView
Android WebView

按MENU按鈕可以調用菜單, 包括Goto, Forward,Back,Reload, Exit五個選項.

Goto(輸入網址): 屏幕上方會出現一個EditText和一個Button, 以輸入網址. 這是通過setVisibility()的方法做到需要時才顯示, 不需要時不顯示的效果. 按下GO按鈕, 應用程序會調用WebView.loadUrl()加載網址.

Exit(退出): 就是退出.

Forward(前進)/Back(後退): 在onPrepareOptionsMenu()中根據WebView.canGoForward()和WebView.CanGoBack()決定按鈕有沒有效, 再通過setEnabled()設定. 當被選擇時調用WebView.goForward()或WebView.goBack()實現.

Reload(重載): 調用WebView.loadUrl()重載網址.

首先,創建一個新/res/menu/的menu.xml文件
(可參考"使用XML定義Options Menu(選項菜單)")
<?xml version="1.0" encoding="UTF-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/gotourl"
android:title="Goto" />
<item android:id="@+id/exit"
android:title="Exit" />
<item android:id="@+id/goback"
android:title="Back" />
<item android:id="@+id/reload"
android:title="Reload" />
<item android:id="@+id/goforward"
android:title="Forward" />
</menu>


修改main.xml
<?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"
>
<RelativeLayout
android:id="@+id/UrlEntry"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:shrinkColumns="0"
android:visibility="gone"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:id="@+id/go"
android:text="GO"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/go"
android:id="@+id/url"
android:text="http://"
/>

</RelativeLayout>
<WebView android:id="@+id/mybrowser"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>


修改源碼
package com.AndroidWebView;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;

public class AndroidWebView extends Activity {

WebView myBrowser;
RelativeLayout myUrlEntry;
EditText myUrl;
Button myGoButton;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main);

String myURL = "http://www.google.com/m/";
myBrowser=(WebView)findViewById(R.id.mybrowser);
myUrlEntry = (RelativeLayout)findViewById(R.id.UrlEntry);
myUrl = (EditText)findViewById(R.id.url);
myGoButton = (Button)findViewById(R.id.go);
myGoButton.setOnClickListener(myGoButtonOnClickListener);

WebSettings websettings = myBrowser.getSettings();
websettings.setSupportZoom(true);
websettings.setBuiltInZoomControls(true);
websettings.setJavaScriptEnabled(true);

myBrowser.setWebViewClient(new WebViewClient());

myBrowser.loadUrl(myURL);

}

private Button.OnClickListener myGoButtonOnClickListener = new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
myBrowser.loadUrl(myUrl.getText().toString());
myUrlEntry.setVisibility(View.GONE);
}

};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu, menu);
return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
if(myBrowser.canGoForward())
menu.findItem(R.id.goforward).setEnabled(true);
else
menu.findItem(R.id.goforward).setEnabled(false);

if(myBrowser.canGoBack())
menu.findItem(R.id.goback).setEnabled(true);
else
menu.findItem(R.id.goback).setEnabled(false);

myUrlEntry.setVisibility(View.GONE);

return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case (R.id.exit):
openExitDialog();
break;
case (R.id.gotourl):
myUrlEntry.setVisibility(View.VISIBLE);
break;
case (R.id.goback):
myBrowser.goBack();
break;
case (R.id.reload):
myBrowser.reload();
break;
case (R.id.goforward):
myBrowser.goForward();
break;
}
return true;
}

private void openExitDialog()
{
new AlertDialog.Builder(this)
.setTitle("Exit")
.setMessage("Exit the Browser?" )
.setNegativeButton("NO",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialoginterface, int i)
{}
})
.setPositiveButton("YES",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{ finish();
}
})
.show();
}

}



注意: 需參考上一篇"一個簡單的瀏覽器, 網絡視圖(WebView)", 修改清單文件(AndroidManifest.xml).



沒有留言:

發佈留言