基於監聽的事件處理過程
記錄一:安卓界面交互處理事件的兩個方式
(1)基於監聽的事件處理
(2)基於回調的事件處理
基於回調的事件處理日後再寫,先學習基於監聽的事件處理
通常以下步驟:
(1)實例化對象
(2)爲事件源對象添加監聽器對象,例如set...Listener();
(3)當事件發生時,系統會將事件封裝成相應類型的對象,發送給註冊事件源的監聽器對象
(4)當監聽器對象接收事件對象後,系統會調用監聽器中相應的事件處理方法來處理事件給出響應
常用的監聽接口有OnClickListener接口、OnLongClickListener接口、OnFocusChangeListener接口、OnKeyListener接口和OnTouchListener接口五種
OnClickListener使用:
java代碼
package lesson.ssh.listenertest;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//實例化事件源
Button btn = (Button) findViewById(R.id.button1);
//爲事件源註冊監聽接口
btn.setOnClickListener(new OnClickListener() {
//實現監聽接口內的事件處理方法
@Override
public void onClick(View v) {
//在MainActivity活動中給出一個提示
//提示內容爲"You clicked the button"
//Toast.LENGTH_SHORT短暫時間顯示
//使用Toast中的show()方法顯示提示
Toast.makeText(MainActivity.this, "You clicked the button",
Toast.LENGTH_SHORT).show();
}
});
}
佈局文件:就一個按鈕
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
效果略,點擊按鈕後就是一個吐司。
但是當有很多個按鈕的時候,像這樣一個一個實例化,註冊,監聽,還是很麻煩的,因此可以有另外一種處理方法,在佈局文件中組件使用屬性android:onClick="onClick",這個方法只需要在活動中實現即可。引號裏面的是在java代碼中要實現的方法名,隨意即可,但要一致。下面是一個具體的方法
佈局代碼:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".GameMain" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="28dp"
android:gravity="center"
android:text="@string/app_name"/>
<Button
android:id="@+id/btn_about"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_about"
android:textSize="18dp"
android:onClick="onClick"/>
<Button
android:id="@+id/btn_exit"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_exit"
android:textSize="18dp"
android:onClick="onClick"/>
</LinearLayout>
java代碼:GameMain.java
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class GameMain extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game_main);
}
//此處函數是針對點擊按鈕後發生的反應
public void onClick(View view)
{
switch(view.getId()) //檢測是那個按鈕被點擊了,查找id
{
case R.id.btn_about:
Toast.makeText(GameMain.this, "點擊了about按鈕", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_exit:
this.finish(); //這個是程序退出
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.game_main, menu);
return true;
}
}
OnLongClickListener:
跟OnClickListener差不多
比如用於按鈕,長時間按按鈕纔對觸發的
都是先找控件、設監聽,重寫監聽接口內的事件處理方法
package lesson.ssh.listenertest;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* findViewById(int)的返回值是View類的實例
* */
final TextView tv=(TextView)findViewById(R.id.textView1);
//實例化事件源
Button btn = (Button) findViewById(R.id.button1);
//爲事件源註冊監聽接口
btn.setOnLongClickListener(new OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
/**
* 設置文本顯示內容爲“You clicked me!”
* 設置字體大小爲30f
* 設置字體顏色爲綠色
*/
tv.setText("You clicked me!");
tv.setTextSize(30f);
tv.setTextColor(Color.GREEN);
//此處用java實現TextView,當然也可以跟上邊那個用Toast
return false;
}
});
}
}
OnFocusChangeListener接口:
用來處理控件焦點發生改變的事件。當某個控件失去焦點或者獲得焦點時都會觸發該接口中的回調方法
回調方法:
public void onFocusChanges(View v,Boolean hasFocus)
//參數View v:v是觸發該事件的事件源
//參數hasFocus:參數hasFocus表示v的新狀態,即v是否是獲得焦點
具體的實現樣例
/**
* 本次註冊監聽接口和原來有別,原來是在事件源上註冊監聽器,而本次是在活動上使用implements來繼承監聽接口
* 然後使用某個視圖組件的實例,進行註冊,註冊方法xxx.setOnFocusChangeListener(this),xxx是視圖組件
* 然後在你活動中重構並完成該接口的抽象方法onFocusChange
* */
public class MainActivity extends Activity implements OnFocusChangeListener{
TextView tv=null;
EditText et1=null;
EditText et2=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* findViewById(int)的返回值是View類的實例
* 使用該方法實例化tv,et1,et2
* */
tv=(TextView)findViewById(R.id.textView1);//佈局文件中,預留了id爲textView1的TextView
tv.setTextSize(30f);
tv.setTextColor(Color.GREEN);
et1=(EditText)findViewById(R.id.editText1);
et2=(EditText)findViewById(R.id.editText2);
/**
* 在事件源上註冊監聽接口
* */
et1.setOnFocusChangeListener(this);
et2.setOnFocusChangeListener(this);
}
/**
* 重構並完成監聽接口OnFocusChangeListener的抽象方法onFocusChange(View v, boolean hasFocus)
* 參數View arg0指的是與焦點有關的視圖組件,boolean hasFocus的值有true和false之分,true代表獲得焦點,false
* 表示失去焦點
* */
@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
switch(v.getId())
{case R.id.editText1: //監聽到第一個編輯框焦點改變
if(hasFocus==true)
{
tv.setText("EditText1 has focused");
}
break;
case R.id.editText2: //監聽到第二個編輯框焦點發生改變
if(hasFocus==true)
{
tv.setText("EditText2 has focused");
}
break;
}
}
}
佈局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</EditText>
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
(4)OnKeyListener接口
對手機鍵盤進行監聽的接口,通過對某個View註冊該監聽,當View獲得焦點並有鍵盤事件時,便會觸發該接口中的回調方法
回調方法:
public boolean onKey(View v,int keyCode,KeyEvent event)
//參數v:爲事件的事件源控件
//參數keyCode: 參數keyCode爲手機鍵盤的鍵盤碼
//參數event:參數event爲鍵盤事件封裝類的對象,其中包含了事件的詳細信息,例如發生的事件,事件的類型等
(5)OnTouchListener接口
用來處理手機屏幕事件的監聽接口的。當爲View的範圍內觸摸按下、擡起或滑動等動作時都會觸發該事件。
回調方法:
public boolean onTouch(View v,MotionEvent event)
//參數v:需要實現onTouch方法
//參數event:參數event爲事件封裝類的對象,其中封裝了觸發事件的詳細信息,同樣包括事件的類型、觸發時間等信息