在任何一個 GUI 系統中,控制界面上的控件(一般稱爲控件)都是一個基本的內容。對於 Android 應用程序,控件稱爲 View。java
在 Android 中,在處理 UI 中的各類元素的時候,兩個程序中的要點爲:android
Android 中3種基本的程序控制方法。例子效果是經過 2 個按鈕來控制一個文本框的背景顏色。app
佈局文件(layout)的代碼片斷以下所示:ide
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/screen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="24sp"
android:text="@string/text1" />
<Button android:id="@+id/button1"
android:layout_width="80sp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/red"/>
<Button android:id="@+id/button2"
android:layout_width="80sp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/green"/>
</LinearLayout>函數
1.事件響應方法佈局
根據以上的佈局文件中定義的兩個按鈕和一個文本框,這個佈局文件被活動設置爲 View 後,顯示的內容就如上
圖所示,只是行爲尚未實現。
行爲將在源代碼文件 TestEvent1.java 中實現,這部分的代碼以下所示:this
package com.android.basicapp;
import android.app.Activity;
import android.os.Bundle;
import android.graphics.Color;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;
public class TestEvent1 extends Activity {
private static final String TAG = "TestEvent1";
public TestEvent1() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testevent);
final TextView Text = (TextView) findViewById(R.id.text1);
// 得到句柄
final Button Button1 = (Button) findViewById(R.id.button1);
final Button Button2 = (Button) findViewById(R.id.button2);
Button1.setOnClickListener(new OnClickListener() { // 實現行爲功能
public void onClick(View v) {
Text.setBackgroundColor(Color.RED);
}
});
Button2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Text.setBackgroundColor(Color.GREEN);
}
});
}
}xml
在建立的過程當中,經過 findViewById 得到各個屏幕上面的控件(控件)的背景,這裏使用的 R.id.button1 等和佈局文件中各個元素的 id 是對應的。實際上,在佈局文件中,各個控件即便不寫 android:id 這一項也能夠正常顯示,可是若是須要在代碼中進行控制,則必須設置這一項。
根 據 Button 控 件 的 setOnClickListener() 設 置 了 其 中 的 點 擊 行 爲 , 這 個 方 法 的 參 數 實 際 上 是 一 個View.OnClickListener 類型的接口,這個接口須要被實現纔可以使用,所以在本例的設置中,實現了其中的 onClick()函數。這樣既可實現點擊的時候實現相應的功能,在點擊的函數中,將經過 Text 的句柄對其進行控制。接口
2.第二種響應方法事件
除了上述的使用方法,在使用一樣的佈局文件和應用程序的狀況下,實現一樣的功能。本例中使用的是另外的
一種方式實現。
本例使用的源代碼文件以下所示:
package com.android.basicapp;
import android.app.Activity;
import android.os.Bundle;
import android.graphics.Color;
import
import
import
import
android.widget.Button;
android.widget.TextView;
android.view.View;
android.view.View.OnClickListener;
import android.util.Log;
public class TestEvent2 extends Activity implements OnClickListener {
// 實現相關的接口
private static final String TAG = "TestEvent2";
private TextView mText;
private Button mButton1;
private Button mButton2;
public TestEvent2() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testevent);
mText = (TextView) findViewById(R.id.text1);
mButton1 = (Button) findViewById(R.id.button1);
mButton1.setOnClickListener(this); // 設置監聽的類
mButton2 = (Button) findViewById(R.id.button2);
mButton2.setOnClickListener(this); // 設置監聽的類
}
public void onClick(View v) {
Log.v(TAG, "onClick()");
switch(v.getId()){
// 區分不一樣的控件
case R.id.button1:
mText.setBackgroundColor(Color.RED);
break;
case R.id.button2:
mText.setBackgroundColor(Color.GREEN);
break;
default:
Log.v(TAG, "other");
break;
}
}
}
這個例子的主要變化是讓活動實現(implements)了 OnClickListener()這個進口,也就是須要實現其中的 onClick()方法。而後經過 setOnClickListener()將其設置到按鈕中的 參數就是 this,表示了當前的活動。
經過這種方式的設置,若是程序中有多個控件須要設置,那麼所設置的也都是一個函數。爲了保證對不一樣控件具備不一樣的處理,能夠由 onClick()函數的參數進行判斷,參數是一個 View 類型,經過 getId()得到它們的 ID,使用switch...case 分別進行處理。
在本例中,經過將須要將文本框(TextView)句柄保存爲類的成員(mText),這樣就能夠在類的各個函數中都能得到這個句柄進行處理。這和上一種方法是有區別的,由於上一個例子實現的接口和得到的 TextView 在同一個函數中,所以不須要保存 TextView 的句柄。
3.第三種響應方法
本例介紹一樣功能實現的第三種方法,區別也僅僅在於 JAVA 源代碼中,實現的內容以下所示。
import android.view.View.OnClickListener;
import android.util.Log;
public class TestEvent3 extends Activity{
private
private
private
private
static final String TAG = "TestEvent3";
TextView mText;
Button1_OnClickListener mListener1 = new Button1_OnClickListener();
Button2_OnClickListener mListener2 = new Button2_OnClickListener();
public TestEvent3() {
}
class Button1_OnClickListener implements OnClickListener { // 接口的第一個實現
public void onClick(View v) {
mText.setBackgroundColor(Color.RED);
}
}
class Button2_OnClickListener implements OnClickListener { // 接口的第一個實現
public void onClick(View v) {
mText.setBackgroundColor(Color.GREEN);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testevent);
mText = (TextView) findViewById(R.id.text1);
final Button mButton1 = (Button) findViewById(R.id.button1);
final Button mButton2 = (Button) findViewById(R.id.button2);
mButton1.setOnClickListener(mListener1);
mButton2.setOnClickListener(mListener2);
// 設置監聽者的類
// 設置監聽者的類
}
}
本例經過定義實現活動類中的 2 個子類,來實現 View.OnClickListener 這個接口,這種方式是一種最爲直接的方 式,即爲不一樣的控件單獨實現它的相應類。