4. 由於可能有多個按鈕,其事件都會傳遞到 ex02 類別,都由 onClick()函數負責 處理,所以在onClick()函數裡的 switch 指令藉由按鈕 id 值來判斷到底是哪一 個按鈕送來的事件。如果是由id 值為 id/button 的按鈕(即 OK)所送來的話,就 在畫面標題(Title)區顯示出字串:”this is OK button”。 反之,如果是由 id 值 為id/button2 的按鈕(即 Exit)所送來的話,就呼叫父類別的 finish()函數而結束 目前的畫面(即目前的 Activity)。
4.3 #3:如何呈現按鈕(Button)之 2
在上一個範例裡,使用了指令:btn.setOnClickListener(this)來指明要將按鈕 的 事 件 傳 遞 給 目 前 物 件 的 onClick() 函 數 去 處 理 之 。 本 範 例 則 使 用 指 令 : btn.setOnClickListener(listener)將按鈕的事件傳遞給 listener 物件的 onClick()函數 處理之。
4.3.1 操作情境:
1. 首先,此程式的畫面出現按鈕如下:
2. 如果按下<OK>按鈕,畫面標題(Title)區顯示出字串:”this is OK button”。
3. 如果選取<Exit>,程式就結束了。
4.3.2 撰寫步驟:
第 4 章 Android 應用程式設計的基礎手藝:12 技 93
public class ex03 extends Activity { @Override
public void onCreate(Bundle icicle) { super.onCreate(icicle);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.button);
Button btn2 = (Button)findViewById(R.id.button2);
btn.setOnClickListener(listener);
btn2.setOnClickListener(listener2);
}
OnClickListener listener = new OnClickListener() {
public void onClick(View v) { setTitle("this is OK button"); } };
OnClickListener listener2 = new OnClickListener() { public void onClick(View v) { finish(); } };
}
Step-3: 修改/res/layout/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"
>
<TextView android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
94 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OK"
/>
<Button android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exit"
/>
</LinearLayout>
並儲存之。
Step-4: 執行之。
4.3.3 說明:
1. 指令:btn.setOnClickListener(listener);
這指明將 btn 按鈕的事件傳遞給 listener 物件的 onClick()函數處理之。
2. 回想,在先前的「第 2 技」裡,使用了指令:btn.setOnClickListener(this);
這指明要將btn 按鈕的事件傳遞給目前物件的 onClick()函數處理。
3. 以上的兩種指令寫法的效果是一樣的,由你自己決定如何彈性運用。
4.3.4 補充說明:
剛才的範例,其畫面上有兩個按鈕(Button),但是很樸素單調,沒有圖案或 色彩。如果你想替按鈕加上一些花樣,有兩個主要的途徑:
1) 使用 Button 類別的 setBackgroundResource()函數,可以替按鈕加上背景 圖案。
2) 改用 ImageButton 類別,可以替按鈕加上前景圖像。
例如,將改上一範例的 Button 改為 ImageButton,會出現比較漂亮的按鈕了。如 下述的畫面:
第 4 章 Android 應用程式設計的基礎手藝:12 技 95
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
為了實現這美觀的按鈕,可將上一範例的程式碼改寫為:
// ---- ex03_a.java 程式碼 --- package com.misoo.ex03;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
public class ex03 extends Activity { @Override
public void onCreate(Bundle icicle) { super.onCreate(icicle);
setContentView(R.layout.main);
ImageButton btn = (ImageButton)findViewById(R.id.button);
ImageButton btn2 = (ImageButton)findViewById(R.id.button2);
btn.setOnClickListener(listener);
btn2.setOnClickListener(listener2);
}
OnClickListener listener = new OnClickListener() { public void onClick(View v) {
setTitle("this is OK button");
} };
OnClickListener listener2 = new OnClickListener() { public void onClick(View v)
{ finish(); } };
}
96 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
這 段 程 式 碼 使 用 到 /res/drawable/ 裡 的 兩 個 圖 像 : ok.jpg 和 exit.jpg 。 而 ImageButton 按鈕與圖像之關係則描述於/res/layout/main.xml 檔案裡,如下圖:
本書主旨在於介紹 Android 程式的基本組件和架構,為了讓範例更為簡單易
懂,本書並未使用許多種點綴和雕飾。但是隨著你的經驗成長了,想要畫龍點
睛,自然會去嘗試將Android 程式畫面雕飾得漂亮又大方。
第 4 章 Android 應用程式設計的基礎手藝:12 技 97
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯