Jollen 的 Android 教學,#16: Event Listener的用..
时间:2010-10-19 来源:landuochong
Event Listener的用法: 以Click Listener為例
以Android所提供的View.OnClickListener來說明程式實作方法。一個較為良好的實作方法是在我們的Acitivty類別裡 實作View.OnClickListener介面,即:
import android.view.View;
public class HelloClickListener extends Activity implements View.OnClickListener {
...
}
每一個View都可以註冊一個event listener,當Android框架收到「click」事件後,便回呼event listener的callback method。以Button類別(按鈕元件)為例,當我們想要處理使用者觸控按鈕的事件時,就要呼叫Button類別的 setOnClickListener()方法來註冊click listener。上述的實作方方法是,直接在我們的Activity類別HelloClickListener裡實作 View.OnClickListener,因此上述Button類別的click listener為「this」。
上述的實作觀念,可用圖1來表示。
圖1: HelloClickListener類別實作View.OnClickListener介面
註冊click listener的程式碼如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.btn);
button.setOnClickListener(this);
}
在onCreate()裡先找到Button元件,它的click listener為this為,接著在我們的Activity類別裡實作onClick()。onClick()方法的程式碼如下,我們以Toast類別 來回應訊息給使用者:
public void onClick(View v) {
Toast.makeText(
this,
"Yes.",
Toast.LENGTH_LONG).show();
}
完整程式碼: HelloClickListener.java
package com.moko.helloclicklistener;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
public class HelloClickListener extends Activity implements View.OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.btn);
button.setOnClickListener(this);
}
public void onClick(View v) {
Toast.makeText(
this,
"Yes.",
Toast.LENGTH_LONG).show();
}
}
執行結果
圖2: HelloClickListener的執行結果
當使用者觸碰畫面上的按鈕時,便以Toast類別在畫面上顯示「Yes」。
什麼是樣式(Styles)?
Android的樣式設計(style)是一個很重要的功能,因為它可以讓應用程式裡的元件(widget)「長」得跟別人很不一樣。樣式設計的使 用規定如下:
- 在Android專案裡以XML資源檔來定義「樣式」
- 一個Android專案可以定義多個樣式
- 讓widget套用其中一個樣式
Android的styles功能,主要的對象是widget,樣式是為了套用到widget上;另外Android還提供佈景(theme)功 能,可以做更大範圍的套用。
如何定義樣式
定義樣式的方式如下:
1. 在Android專案的「res/values」資料夾裡建立styles.xml樣式定義檔。如圖1。
圖1: 建立styles.xml
2.在styles.xml裡定義樣式,以下是一個範例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="myText">
<item name="android:textSize">18sp</item>
<item name="android:textColor">#880</item>
</style>
</resources>
styles.xml的寫法說明如下:
1. 在 <resource>標籤裡定義資源項目, <style>標籤用來定義樣式資源
2. <style>的name屬性定義此樣式的名字,widget使用此名字以套用樣式
3. <item>標籤定義此樣式的內容
4. <item>的name屬性為android:textSize時,表示定義此樣式的字體大小,在此設定字體大小為18sp
5. <item>的name屬性為android:textColor時,表示定義此樣式的字體顏色,在此設定字體顏色為#880(RGB)
6. 更多的樣式屬性,請參考Android Reference
定義好樣式後,就可以讓widget套用樣式。
Widget如何套用樣式
如何讓widget套用上述定義的「myText」樣式,方法很簡單。還記得UI layout檔main.xml嗎?只要在widget的項目裡,加上style屬性,並指定樣式名稱即可。以下是HelloStyles範例:
<?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:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello, this is HelloStyles."
style="@style/myText"
/>
</LinearLayout>
「@style/myText」表示要指定一個style的名稱,此名稱為myText。
執行結果:图略
上一節提到佈景(theme)是可以大範圍套用的UI美化功能,其套用範圍為「整個 螢幕」,從程式碼的角度來看,佈景可以套用到以下二個範圍:
- 整個應用程式(application)
- 整個activity
接下來,我們以一個很簡單的例子,來說明如何套用佈景到application。在一些應用,我們可能不想要顯示視窗標題(title),怎麼做出 這個功能呢?利用佈景設定的方式即可達成。以下是實作方法。
在styles.xml裡加入以下內容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="myTheme">
<item name="android:windowNoTitle">true
</style>
</resources>
修改AndroidManifest.xml,在標籤裡加上「theme」屬性:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.moko.hellotheme"
android:versionCode="1"
android:versionName="1.0.0">
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:theme="@style/myTheme">
<activity android:name=".HelloTheme"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
執行結果:
圖1: HelloTheme的執行結果
在這個範例裡,我們並沒有修改任何的程式碼,其原理是透過佈景設定的方法。定義佈景的方式與定義樣式(styles)相同,同樣是在 styles.xml裡以<item>標籤來定義。
以下是使用HelloTheme的說明:
1. <item>的name屬性為android:windowNoTitle時,表示定義是否要顯示視窗標題,在此設定為true,表示不要有 視窗標題
2. 在<application>標籤裡加上theme屬性,將佈景套用到應用程式
佈景除了能套用到應用程式外,也能套用到activity。如何套用佈景到activity呢?只要在<activity>裡加入 theme屬性即可,做法與<application>相同。