1. 程式人生 > >Android開發入門例項:四則混合運算計算器

Android開發入門例項:四則混合運算計算器

        開發Android應用主要使用的語言是Java,佈局檔案和介面則一般用XML來描述。整個應用的GUI開發與Java SWT、QT等其實區別不是特別大。如果有任何一種GUI程式開發經驗,學習Android應用開發就是一件非常容易的事。這篇文章裡我們來開發一個支援四則混合運算的簡易計算器APP,這個APP演示了開發Android專案的一般流程以及基本方法。

        環境:Windows 7 x64、JDK8、adt-bundle-windows-x86_64-20140702。

一、安裝JDK8與ADT

        JDK8是Java SDK的最新版本,ADT-bundle則是Android官方釋出的以Eclipse為基礎的Android開發環境。兩個軟體包都可以從官網下載,點選下載

JDK8adt-bundle,ADT官方被牆了,所以只能從其它地方下載。

        雙擊JDK8的安裝程式,按照正常的步驟即可安裝成功。ADT-bundle不需要安裝,直接解壓就可以啟動eclipse.exe使用了,但是注意一定要設定JAVA_HOME到環境變數。

二、新建Android專案

        開啟Eclipse後,File -> New -> Other,在彈出的對話方塊中選擇Android專案中的Android Application Project,並點選 Next。然後輸入Application Name、Project Name、Package Name,並分別選擇最低要求的SDK版本、目標SDK版本、專案編譯版本、應用主題,這裡由於我們是用來測試的,所以前三項均選擇Android 4.0,第四項預設。接下來的兩個對話方塊主要是用來設定應用的圖示及一個新的Activity。

        完成後,專案的目錄結構差不多是下圖這個樣子:


        最重要的是res目錄、src目錄,以及AndroidManifest.xml檔案。res目錄中的layout目錄存放了專案中每個Activity的介面佈局,values目錄則存放專案中所有用到的明文字串及主題等資源。src目錄就是應用的所有java原始碼。AndroidManifest.xml是專案的主工程檔案。

        無論多簡單的專案都少不了上面所列出的這些目錄和檔案。下面我們來逐個解析這些檔案。

三、工程管理檔案AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.icalculator"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!-- 
        	主Activity
         -->
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 
        	“關於”Activity
         -->
        <activity
            android:name=".AboutActivity"
            android:label="@string/title_activity_about" >
        </activity>
    </application>

</manifest>
        manifest中的package指定了本工程的原始碼在哪個包裡面。uses-sdk中的內容在之前新建專案的時候就已經配置好了,即說明本APP支援的最低版本及目標版本。application中的icon、label、theme等分別指定了APP的圖示、名稱、主題風格,這裡用@符號來從檔案中引用內容,如app_name是strings.xml中定義的一個字串,在這裡被引用為label。

        這個配置檔案中最關鍵的是activity項。

        Android應用由一個或多個Activity組成,Activity有自己有介面佈局和控制程式碼,不同的Activity可以互相跳轉並組合完成各種任務。Activity需要指定name和label,name可以確定原始碼中對應的Activity是哪一個,label是Activity顯示在介面上的一個標題。

        不同的Activity之間跳轉時,必須由intent來控制。使用者啟動APP跳轉到APP的入口Activity時,也需要一個特定的intent來說明。上面程式碼中第一個Activity就有intent-filter欄位,將action指定為"android.intent.action.MAIN"說明該Activity是當前APP的主Activity,將category指定為"android.intent.category.LAUNCHER"說明該Activity將由使用者啟動。

四、res資源目錄及其包含的檔案

        先看values/strings.xml檔案。這個檔案中定義了APP需要用到的各種字串。APP使用這些字串的時候最好以引用的方式從這個檔案中包含進來,而不要直接硬編碼到程式中。strings.xml內容很簡單,類似於下面這樣:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">iCalculator</string>
    <string name="title_activity_main">iCalculator</string>
    <string name="about">關於</string>
    <string name="title_activity_about">關於</string>
    <string name = "about_info_back_button" >返回</string>
    <string name = "about_info_title" >Hail to Me</string>
    <string name="about_info">The World Will See My Might !</string>
    
    <string name = "calculator_error" >錯誤</string>
    
    <string name = "menu_quit" >退出</string>

</resources>
        當需要引用這些字串的時候,用@string/about這樣的方式就可以了。例如@string/about實際表示“關於”這個字串。

        values/styles.xml檔案中指定了APP的主題風格,一般沒有特殊要求的話可以不必改動。

        跟介面佈局有關的最重要的檔案都在res/layout目錄中,例如我們可以把主Activity的佈局寫在res/layout/activity_main.xml檔案中,內容如下:

<?xml version = "1.0" encoding = "utf-8" ?>

<!-- 
	主佈局是一個垂直的線性佈局,從上到下依次是顯示屏和各種按鈕
 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation = "vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >
    
	<LinearLayout
	    android:orientation = "horizontal"
	    android:layout_width = "match_parent"
	    android:layout_height = "wrap_content"
	    android:layout_weight="1"
	    >
		<!-- 
		  	先是顯示屏,一個EditText控制元件
		 -->
		<EditText 
		    android:id = "@+id/display_edittext"
		    android:layout_width = "match_parent"
		    android:layout_height = "match_parent"
		    android:singleLine="true"
		    android:gravity="right"
		    android:editable = "false"
		    android:textSize = "32sp"
		    android:text = "" 
		    />
	</LinearLayout>
	
	<LinearLayout 
	    android:orientation = "horizontal"
	    android:layout_width = "match_parent"
	    android:layout_height = "wrap_content"
	    android:layout_weight = "1"
	    >
		<!--
			關於、(、)、CE 按鈕  
		 -->
	    <Button
	        android:id = "@+id/digit_about_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "@string/about"
	    />
	   	<Button
	        android:id = "@+id/digit_left_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "("
	    />
	    <Button
	        android:id = "@+id/digit_right_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = ")"
	    />
	    <Button
	        android:id = "@+id/digit_ce_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "CE"
	    />
	</LinearLayout>
	
	<LinearLayout
	    android:orientation = "horizontal"
	    android:layout_width = "match_parent"
	    android:layout_height = "wrap_content"
	    android:layout_weight = "1"
	    >
	    <!-- 
	    	然後是 7、8、9、/ 四個按鈕
	     -->
	    <Button
	        android:id = "@+id/digit_7_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "7"
	    />
	   	<Button
	        android:id = "@+id/digit_8_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "8"
	    />
	    <Button
	        android:id = "@+id/digit_9_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "9"
	    />
	    <Button
	        android:id = "@+id/digit_div_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "/"
	    />
	</LinearLayout>
	<LinearLayout
	    android:orientation = "horizontal"
	    android:layout_width = "match_parent"
	    android:layout_height = "wrap_content"
	    android:layout_weight = "1"
	    >
	    <!-- 
	    	然後是 4、5、6、* 四個按鈕
	     -->
	    <Button
	        android:id = "@+id/digit_4_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "4"
	    />
	   	<Button
	        android:id = "@+id/digit_5_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "5"
	    />
	    <Button
	        android:id = "@+id/digit_6_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "6"
	    />
	    <Button
	        android:id = "@+id/digit_multi_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "*"
	    />
	</LinearLayout>
	<LinearLayout
	    android:orientation = "horizontal"
	    android:layout_width = "match_parent"
	    android:layout_height = "wrap_content"
	    android:layout_weight = "1"
	    >
	    <!-- 
	    	然後是 1、2、3、- 四個按鈕
	     -->
	    <Button
	        android:id = "@+id/digit_1_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "1"
	    />
	   	<Button
	        android:id = "@+id/digit_2_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "2"
	    />
	    <Button
	        android:id = "@+id/digit_3_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "3"
	    />
	    <Button
	        android:id = "@+id/digit_minus_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "-"
	    />
	</LinearLayout>
	<LinearLayout
	    android:orientation = "horizontal"
	    android:layout_width = "match_parent"
	    android:layout_height = "wrap_content"
	    android:layout_weight = "1"
	    >
	    <!-- 
	    	然後是 0、.、=、+ 四個按鈕
	     -->
	    <Button
	        android:id = "@+id/digit_0_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "0"
	    />
	   	<Button
	        android:id = "@+id/digit_dot_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "."
	    />
	    <Button
	        android:id = "@+id/digit_equal_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "="
	    />
	    <Button
	        android:id = "@+id/digit_plus_button"
	        android:layout_width = "wrap_content"
	        android:layout_height = "match_parent"
	        android:layout_weight="1"
	        android:text = "+"
	    />
	</LinearLayout>
</LinearLayout>
        這個檔案中實際包含了兩類跟介面有關的內容:layout和widget。LinearLayout屬於layout,layout指明瞭該如何在介面上排列元件。這裡用到的LinearLayout說明使用線性佈局來部署所有的元件,LinearLayout在指定orientation屬性(orientation=“vertical"或orientation="horizontal")後,可以分別以垂直或水平的方式進行線性佈局。layout_width和layout_height指定了此佈局的寬度和高度,其值為"match_parent"時,子佈局(或元件)的寬度/高度與其父佈局/父元件保持一致,值為"wrap_content"時,子佈局(或元件)將按照自己的實際大小來顯示。

        檔案中的EditText和Button屬於widget,即元件(或構件),用來完成某個特定的動作(如輸入文字、顯示文字、作為一個按鈕接收點選訊號等)。EditText是編輯框元件,通常用來輸入文字,在設定editable="false"後禁止編輯,用來作為顯示屏使用。gravity屬性決定了編輯框中的文字對齊方式,有"center""right""left"等。Button是按鈕元件。

        所有的widget都有一個id,這個id非常重要,因為id是原始碼中獲取元件控制代碼的惟一方式。@+id/digit_plus_button表示新增一個名為"digit_plus_button"的id,並將此id指定給相關聯的widget。

        layout和widget的weight(權重)屬性也值得說明一下。例如有三個layout,名稱分別為layout_1/layout_2/layout_3,這三個layout的weight分別設定1、1、1時,則三個layout分別各佔據了父layout(或父widget)三分一的空間,如果它們的wieght分別設定為1、2、1,,則父layout或父widget的空間被平均分為4份,layout_1和layout_3各佔據1份,layout_2則佔據2份。上面這個activity_main.xml檔案所繪製的介面如下圖所示:


        左上角那個五顏六色的圖示是我從網上找來的,可以在設定APP的圖示時指定,也可以在Androidmanifest.xml檔案application項的icon中指定。

        本示例涉及到的另一個activity_about.xml內容如下:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/about_info_textview_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_weight = "2"
        android:textSize = "32sp"
        android:text="@string/about_info_title" />
    <TextView 
        android:id = "@+id/about_info_textview"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:layout_below="@id/about_info_textview_title"
        android:layout_weight = "10"
        android:gravity = "center"
        android:textSize = "22sp"
        android:text = "@string/about_info"
        />
    
    <Button
        android:id = "@+id/about_info_back_button"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_below="@id/about_info_textview"
        android:layout_weight = "1"
        android:layout_gravity = "right"
        android:text = "@string/about_info_back_button"
        />

</LinearLayout>

五、Java類程式碼

        在Android應用中,基本的專案開發單位就是Activity,一個Activity分別對應一個java類和一個activity.xml佈局檔案。

        Activity的類程式碼控制所有的資源和APP流程。

        本示例中主Activity相關聯的類MainActivity位於com.example.icalculator包中,程式碼清單如下:

package com.example.icalculator;

import com.example.icalculator.R.id;

import android.app.Activity;
import android.os.Bundle;

import android.view.View;
import android.view.View.OnClickListener;

import android.view.Menu;
import android.view.MenuItem;

import android.widget.Button;
import android.widget.EditText;

import android.content.Intent;

/**
 * 
 * @author Administrator
 *
 * 由於按鈕較多,需要監聽的類似事件比較多,所以用Switch方法來監聽,
 * 需要實現OnClickListener介面
 * 
 */

public class MainActivity extends Activity implements OnClickListener{

	/**
	 * 這個是全域性的字串,用來儲存顯示在顯示屏上的計算式及結果
	 */
	private String calculator_string;
	
	private static final int quit_menu_item = Menu.FIRST;
	
	private EditText displayEditText;
	private Button aboutButton;
	private Button leftButton;
	private Button rightButton;
	private Button ceButton;
	private Button dig7Button;
	private Button dig8Button;
	private Button dig9Button;
	private Button digDivButton;
	private Button dig4Button;
	private Button dig5Button;
	private Button dig6Button;
	private Button digMultiButton;
	private Button dig1Button;
	private Button dig2Button;
	private Button dig3Button;
	private Button digMinusButton;
	private Button dig0Button;
	private Button digDotButton;
	private Button digEqualButton;
	private Button digPlusButton;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		calculator_string = "";
		
		displayEditText = ( EditText )findViewById( R.id.display_edittext );
		
		aboutButton = ( Button )findViewById( R.id.digit_about_button );
		aboutButton.setOnClickListener( this );
		
		leftButton = ( Button )findViewById( R.id.digit_left_button );
		leftButton.setOnClickListener( this );
		
		rightButton = ( Button )findViewById( R.id.digit_right_button );
		rightButton.setOnClickListener( this );
		
		ceButton = ( Button )findViewById( R.id.digit_ce_button );
		ceButton.setOnClickListener( this );
		
		dig7Button = ( Button ) findViewById( R.id.digit_7_button );
		dig7Button.setOnClickListener( this );
		
		dig8Button = ( Button ) findViewById( R.id.digit_8_button );
		dig8Button.setOnClickListener( this );
		
		dig9Button = ( Button ) findViewById( R.id.digit_9_button );
		dig9Button.setOnClickListener( this );
		
		digDivButton = ( Button ) findViewById( R.id.digit_div_button );
		digDivButton.setOnClickListener( this );
		
		dig4Button = ( Button ) findViewById( R.id.digit_4_button );
		dig4Button.setOnClickListener( this );
		
		dig5Button = ( Button ) findViewById( R.id.digit_5_button );
		dig5Button.setOnClickListener( this );
		
		dig6Button = ( Button ) findViewById( R.id.digit_6_button );
		dig6Button.setOnClickListener( this );
		
		digMultiButton = ( Button ) findViewById( R.id.digit_multi_button );
		digMultiButton.setOnClickListener( this );
		
		dig1Button = ( Button ) findViewById( R.id.digit_1_button );
		dig1Button.setOnClickListener( this );
		
		dig2Button = ( Button ) findViewById( R.id.digit_2_button );
		dig2Button.setOnClickListener( this );
		
		dig3Button = ( Button ) findViewById( R.id.digit_3_button );
		dig3Button.setOnClickListener( this );
		
		digMinusButton = ( Button ) findViewById( R.id.digit_minus_button );
		digMinusButton.setOnClickListener( this );
		
		dig0Button = ( Button ) findViewById( R.id.digit_0_button );
		dig0Button.setOnClickListener( this );
		
		digDotButton = ( Button ) findViewById( R.id.digit_dot_button );
		digDotButton.setOnClickListener( this );
		
		digEqualButton = ( Button ) findViewById( R.id.digit_equal_button );
		digEqualButton.setOnClickListener( this );
		
		digPlusButton = ( Button ) findViewById( R.id.digit_plus_button );
		digPlusButton.setOnClickListener( this );
	}
	
	/**
	 * 新建Menu
	 * 
	 */
	@Override
	public boolean onCreateOptionsMenu( Menu menu ){
		super.onCreateOptionsMenu(menu);
		menu.add( 0, Menu.FIRST, 0, R.string.menu_quit );
		
		return true;
	}
	
	/**
	 * Menu被選擇的時候,捕獲及處理相關事件
	 * 
	 */
	@Override
	public boolean onOptionsItemSelected( MenuItem item ){
		switch( item.getItemId() ){
		case quit_menu_item:
			/**
			 * 選擇了“退出”的選單項,則退出
			 * 
			 */
			finish();
			System.exit( 0 );
			break;
		}
		
		return true;
	}
	
	/**
	 * 捕獲及處理按鈕事件
	 * 
	 */
	public void onClick( View v ){
		
		/**
		 * 通過區分不同的id來確定當前監聽到的是哪個控制元件的事件
		 * 
		 */
		switch( v.getId() ){
		case R.id.digit_about_button:
			onAbout( v );
			break;
		case R.id.digit_left_button:
			appendToDisplay( "(" );
			break;
		case R.id.digit_right_button:
			appendToDisplay( ")" );
			break;
		case R.id.digit_ce_button:
			cleanDisplay();
			break;
		case R.id.digit_7_button:
			appendToDisplay( "7" );
			break;
		case R.id.digit_8_button:
			appendToDisplay( "8" );
			break;
		case R.id.digit_9_button:
			appendToDisplay( "9" );
			break;
		case R.id.digit_div_button:
			appendToDisplay( "/" );
			break;
		case R.id.digit_4_button:
			appendToDisplay( "4" );
			break;
		case R.id.digit_5_button:
			appendToDisplay( "5" );
			break;
		case R.id.digit_6_button:
			appendToDisplay( "6" );
			break;
		case R.id.digit_multi_button:
			appendToDisplay( "*" );
			break;
		case R.id.digit_1_button:
			appendToDisplay( "1" );
			break;
		case R.id.digit_2_button:
			appendToDisplay( "2" );
			break;
		case R.id.digit_3_button:
			appendToDisplay( "3" );
			break;
		case R.id.digit_minus_button:
			appendToDisplay( "-" );
			break;
		case R.id.digit_0_button:
			appendToDisplay( "0" );
			break;
		case R.id.digit_dot_button:
			appendToDisplay( "." );
			break;
		case R.id.digit_equal_button:
			calculating();
			break;
		case R.id.digit_plus_button:
			appendToDisplay( "+" );
			break;
		default:
			;
		}
	}
	
	/**
	 * 將傳來的字元追加到顯示屏字串上,並重新寫到顯示屏上
	 * 
	 */
	private void appendToDisplay( String keyChar ){
		calculator_string = calculator_string + keyChar;
		displayEditText.setText( calculator_string );
	}
	
	/**
	 * 顯示屏復位
	 * 
	 */
	private void cleanDisplay(){
		calculator_string = "";
		displayEditText.setText( "" );
	}
	
	/**
	 * 
	 * 使用者點選了“關於”按鈕後,啟用About的Activity
	 */
	private void onAbout( View v ){
		/**
		 * 建立一個Intent來跳轉
		 * 
		 */
		
		Intent intent = new Intent();
		intent.setClass( MainActivity.this, AboutActivity.class );
		startActivity( intent );
	}
	
	/**
	 * 執行這個方法說明使用者點選了等於號,要開始根據calculator_string進行計算了,
	 * 並將執行結果顯示在顯示屏上
	 * 
	 */
	private void calculating(){
		/**
		 * 這裡我們獲得了一個原始的、尚未確定準備性的運算表示式,
		 * 包含左右括號、加、減、乘、除,第一步要進行準備性驗證,
		 * 如果驗證未通過,則在顯示屏上提出出錯及錯誤原因,
		 * 驗證通過後,即可進行計算並將結果輸出到顯示屏上。
		 * 
		 * 表示式驗證和計算需要用到的資料結構是棧,計算時的演算法
		 * 則跟處理字首表示式有關。
		 * 
		 */
	}
}

        可以看到Android開發的流程和一些特點。第一步當然是匯入開發中用到的各種包,android.app.Activity和android.os.Bundle必不可少,前者是所有自定義Activity的基類,後者被用來在Activity之間傳遞資料。根據需要還應當匯入android.view.Menu和android.widget.Button等各種類。

        然後就是新建自己的Activity,從android.app.Activity繼承而來。注意本例的MainActivity同時實現了OnClickListener介面,以方便在介面存在大量元件的時候監聽事件。自定義Activity類中首先要做的就是執行一個父類的onCreate方法,目的是作一些初始化操作。setContentView函式用來設定本Activity對應的佈局,這裡要注意,系統自動生成了一個名為R的類,這個類中包含了所有已經按照要求定義的資源。在類程式碼中引用資源時可以隨時使用R類。然後findViewById方法顧名思義,就是根據layout_..xml檔案中的id來獲取元件的控制代碼。獲取到控制代碼後就可以對其進行操作了,本例中在獲取到控制代碼後直接定義了所有元件的監聽函式。

        由於MainActivity實現了OnClickListener介面,我們可以直接在類的內部實現onClick方法,根據傳來的View來確定是哪一個元件發出了onClick的訊號,並作對應處理。

        onCreateOptionsMenu方法用來新建一個選單,該選單在使用者按下選單鍵/設定鍵時被撥出。

        onOptionsItemSelected方法用來響應選單選項,裡面有一個Switch結構可以區分出是哪個選單項被選擇了,然後就可以作對應處理。

        這裡要注意onAbout方法。當介面上的“關於”按鈕被按下時,onAbout方法被呼叫。該方法中新建並激活了一個Intent,用來啟動一個指定的新的Activity。intent.setClass()第一個引數是發起Intent的源Activity,第二個引數是目標Activity。startActivity( intent )將新建一個目標Activity。源Activity是否關閉取決於是否在startActivity方法之後執行了finish()方法。如果執行finish(),則關閉當前Activity,並跳到新的Activity;如果不執行finish(),則當前Activity會被儲存到系統的"Back Stack"中,然後跳到新Activity,當新Activity關閉後,源Activity就又會被啟用變為當前Activity。

        主介面上有個“關於”按鈕,點選之後就會跳到另一個名為AboutActivity的Activity中,程式碼清單如下:

package com.example.icalculator;

import android.app.Activity;
import android.os.Bundle;

import android.widget.Button;
import android.content.Intent;

import android.view.View;
import android.view.View.OnClickListener;

public class AboutActivity extends Activity {

	private Button backButton;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_about);
		
		backButton = ( Button ) findViewById( R.id.about_info_back_button );
		backButton.setOnClickListener( new OnClickListener(){
			public void onClick( View v ){
				/**
				 * 這個按鈕的目的僅僅是關閉“關於”的Activity。
				 * 如果這裡又新建立了一個Intent,則在跳轉的時候又會新建立一個MainActivity。
				 * 因此這裡不應該新建Intent,直接關閉AboutActivity就可以了。
				 * 因為之前從MainActivity跳轉過來的時候並沒有把該MainActivity,
				 * 本AboutActivity關閉後,就會自動恢復到之前的那個MainActivity。
				 * 
				 */
				
				/*
				Intent intent = new Intent();
				intent.setClass( AboutActivity.this, MainActivity.class );
				startActivity( intent );
				*/
				finish();
			}
		});
	}
}

        看到這裡大家肯定會奇怪,整個程式中並沒有包含對運算表示式進行計算的程式碼。當用戶按下等於號"="時,APP會呼叫calculating()方法,可以看到這個方法仍然是空的。這部分程式碼的可移植性比較強,但是寫起來需要考慮的東西比較多。很久以前我用C++寫過一個,有空再移植到Java下面吧。