事件響應方法(點擊等)


本例構建一個應用程序,其在AndroidManifest.xml描述文件中的內容如下所示:
<activity android:name="TestEvent1" android:label="TestEvent1">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
本例定義了一個Android中基本的活動。
本例的布局文件(layout)的代碼片段如下所示:
<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>

 

根據以上的布局文件中定義的兩個按鈕和一個文本框,這個布局文件被活動設置為View后,顯示的內容就如上圖所示,只是行為還沒有實現。
行為將在源代碼文件TestEvent1.java中實現,這部分的代碼如下所示:
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);
}
});
}
}
在創建的過程中,通過findViewById獲得各個屏幕上面的控件(控件)的背景,這里使用的R.id.button1等和布局文件中各個元素的id是對應的。實際上,在布局文件中,各個控件即使不寫android:id這一項也可以正常顯示,但是如果需要在代碼中進行控制,則必須設置這一項。
根據Button 控件的setOnClickListener()設置了其中的點擊行為,這個方法的參數實際上是一個View.OnClickListener類型的接口,這個接口需要被實現才能夠使用,因此在本例的設置中,實現了其中的onClick()函數。這樣既可實現點擊的時候實現相應的功能,在點擊的函數中,將通過Text的句柄對其進行控制。
在Android的控件使用方面,這兩個編程方面要點是:
􀂄
使用findViewById()獲取布局文件(XML)中控件的句柄;
􀂄
使用setOnXXXListener()設置事件處理函數。
在獲取句柄時需要轉換成相應的控件類型,findViewById()函數的參數是一個整數,返回值是一個android.view.View類型。通過R.id.XXX找到布局文件中定義的ID,然后通過將基礎類轉換成其實際的類獲得真正的句柄。注意:所轉換類必須和布局文件中描述的控件一致。
SetOnXXXListener()等函數是android.view.View類的函數,各種控件(包括Button、EditText)都擴展這個類,同族的函數包括:
void setOnClickListener(View.OnClickListener l);
void setOnFocusChangeListener(View.OnFocusChangeListener l);
55
void setOnKeyListener(View.OnKeyListener l);

void setOnLongClickListener(View.OnLongClickListener l);
void setOnTouchListener(View.OnTouchListener l);
這些函數用於事件處理,它們由程序實現,通過設置這些內容也就設置了控件的行為。這些函數的參數都是所對應的android.view.View類中的方法。
Android中UI基本控制內容:使用findViewById()聯系布局文件中控件和句柄,並通過OnClickListener()等定制句柄的行為。
6.1.2.第二種響應方法
除了上述的使用方法,在使用同樣的布局文件和應用程序的情況下,實現同樣的功能。本例中使用的是另外的一種方式實現。
本例使用的源代碼文件如下所示:
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 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的句柄。
6.1.3.第三種響應方法
本例介紹同樣功能實現的第三種方法,區別也僅僅在於JAVA源代碼中,實現的內容如下所示。
import android.view.View.OnClickListener;
import android.util.Log;
public class TestEvent3 extends Activity{
private static final String TAG = "TestEvent3";
private TextView mText;
private Button1_OnClickListener mListener1 = new Button1_OnClickListener();
private 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這個接口,這種方式是一種最為直接的方式,即為不同的控件單獨實現它的相應類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM