編輯:關於Android編程

說明:實際上,基於監聽的事件處理是一種委托式事件處理。普通組件(事件源)將整個事件處理委托給特定的對象(事件監聽器),當該事件源發生指定的事情時,系統自動生成事件對象,並通知所委托的事件監聽器,由事件監聽器相應的事件處理器來處理這個事件。 2.基於監聽的事件處理開發步驟 (1)獲取普通界面控件(事件源),即被監聽的對象; (2)實現事件監聽器類,該監聽器類是一個特殊的Java類,必須實現一個XxxListener接口。需要注意的是,實現事件監聽器主要有四種形式: >內部類形式:將事件監聽器類定義為當前類的內部類; >外部類形式:將事件監聽器類定義成一個外部類; >類自身作為事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法; >匿名內部類:使用匿名內部類創建事件監聽器對象; (3)調用事件源的setXxxListener方法將事件監聽器對象將事件監聽器對象作為傳入參數注冊給普通組件(事件源)。 三、簡易文本編輯器實例 通過該例,我們將學習如何使用內部類形式等四種方式來實現事件監聽器。
1.源碼 (1)EventTest1.java:主Activity代碼
package com.example.androidevent;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class EventTest1 extends Activity implements OnClickListener
{
private TextView content;
int flag=0; //字體樣式標識
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
content = (TextView)findViewById(R.id.content);
//1.顏色:內部類形式
Button redBtn = (Button)findViewById(R.id.red);
Button greenBtn = (Button)findViewById(R.id.green);
Button blueBtn = (Button)findViewById(R.id.blue);
EventListener inner = new EventListener(); //實例化一個事件監聽器對象
redBtn.setOnClickListener(inner); //向以下界面組件注冊同一個事件監聽器
greenBtn.setOnClickListener(inner);
blueBtn.setOnClickListener(inner);
//2.字體大小:外部類形式
Button bigger = (Button)findViewById(R.id.big);
Button smaller = (Button)findViewById(R.id.small);
OuterListener outer = new OuterListener(content);//實例化一個事件監聽器對象
bigger.setOnClickListener(outer);
smaller.setOnClickListener(outer);
//3.字體樣式:類自身作為事件監聽器
Button boldBtn = (Button)findViewById(R.id.bold);
Button inclineBtn = (Button)findViewById(R.id.incline);
Button normalBtn = (Button)findViewById(R.id.normal);
boldBtn.setOnClickListener(this); //向以下界面組件注冊同一個事件監聽器
inclineBtn.setOnClickListener(this);
normalBtn.setOnClickListener(this);
//4.匿名內部類
final EditText text = (EditText)findViewById(R.id.text);
text.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
String contentText=text.getText().toString();
content.setText(contentText); //將編輯框內容設置到文本顯示框中
}
});
}
/*方法一:內部類形式
* 在onClick函數中,通過視圖的getId()方法判定產生事件組件的ID並作出相應的響應*/
public class EventListener implements OnClickListener
{
public void onClick(View arg0) {
switch(arg0.getId())
{
case R.id.red: //設置紅色按鈕被按下
content.setTextColor(Color.RED);
break;
case R.id.green:
content.setTextColor(Color.GREEN);
break;
case R.id.blue:
content.setTextColor(Color.BLUE);
break;
default:
break;
}
}
}
/*方法3.類自身作為事件監聽器*/
@Override
public void onClick(View v)
{
//flag為樣式標識,當flag=0表示默認,flag=1表示傾斜,flag=2表示加粗,flag=3表示傾斜又加粗
switch(v.getId())
{
case R.id.bold: //設置加粗
if(flag==1||flag==3)
{
content.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC); //設置系統默認的字體樣式
flag=3;
}
else
{
content.setTypeface(Typeface.MONOSPACE,Typeface.BOLD);
flag=2;
}
break;
case R.id.incline:
if(flag==2 || flag==3)
{
content.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC); //設置系統默認的字體樣式
flag=3;
}else
{
content.setTypeface(Typeface.MONOSPACE,Typeface.ITALIC);
flag=1;
}
break;
case R.id.normal:
content.setTypeface(Typeface.MONOSPACE,Typeface.NORMAL); //設置系統默認的字體樣式
flag=0;
break;
default:
break;
}
}
}
(2)OuterListener.java:外部類形式事件監聽器
package com.example.androidevent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
/*外部類形式*/
public class OuterListener implements OnClickListener
{
private TextView text;
private float size;
//構造方法1:將文本組件對象作為參數傳遞並賦值給類成員對象
public OuterListener(TextView t)
{
this.text = t;
}
//構造方法2
public OuterListener()
{
super();
}
public void onClick(View v)
{
size= text.getTextSize(); //獲取文本字體大小
switch(v.getId())
{
case R.id.big :
{
size+=4;
break;
}
case R.id.small :
{
size-=4;
break;
}
default:
break;
}
//設置最值限度
if(size<=8)
size=8;
if(size>=72)
size=72;
text.setTextSize(size);
}
}

(3)源碼分析 a.內部類形式:即將事件監聽器類定義為當前類的內部類。 >優勢:一是使用內部類可以在當前類中復用該監聽器類,即多個事件源可以注冊同一個監聽器; 二是使用內部類可以自由訪問外部類的所有界面控件,內部類實質上是外部類的成員。 >適用范圍:內部類形式比較適合於多個事件源同時注冊同一事件監聽器的情形。 b.外部類形式:將事件監聽器類定義成一個外部類; >缺點:一是由於事件監聽器通常屬於特定的GUI,定義成外部類不利於提高程序的內聚性(如例子中需要通過外部類的構造方法傳遞一個文本對象並將其賦值給當前類的文本對象成員才能對其進行操作);二是外部類形式的事件監聽器不能自由訪問創建GUI界面中的組件且編程不夠簡潔。 >使用范圍:如果某個事件監聽器確實需要被多個GUI界面所共享,而且主要是完成某種業務邏輯的實現,則可以考慮使用外部類的形式來定義事件監聽器類。 c.類自身作為事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法; >優點:Activity類本身作為事件監聽器,就如同生活中,我們自己剛好能夠處理某一件事,不需要委托給他人處理,可以直接在Activity類中定義事件處理器方法,這種形式非常簡潔。 >缺點:可能造成程序結構混亂,Activity的主要職責應該是完成界面初始化工作,但此時還需包含事件處理器方法,從而引起混亂; 如果Activity界面類需要實現監聽器接口,給人感覺比較怪異。 d.匿名內部類:使用匿名內部類創建事件監聽器對象 >優點:事件處理器都沒有什麼復用價值(可復用代碼通常都被抽象成了業務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。實際上,這種形式也是目前使用最廣泛的事件監聽器形式。注意:是匿名內部類中訪問局部成員變量時,該成員變量必須是final修飾的,而對於成員變量則沒有這個要求。 四、常見事件監聽器接口及其處理方法 以上四種形式都需要通過事件監聽類的OnClick成員處理方法,根據界面組件的Id來提供事件響應。此外,除匿名內部類形式,其余三種都需要類繼承相應的事件監聽器接口。 1.常見事件監聽器接口及處理方法
事件
接口
處理方法
描述
單擊事件
View.OnClickListener
abstract void onClick (View v)
單擊組件時觸發
單擊事件
View.OnLongClickListener
abstract boolean onLongClick (View v)
長按組件時觸發
鍵盤事件
View.OnKeyListener
abstract boolean onKey(View v, int keyCode, KeyEvent event)
處理鍵盤事件
焦點事件
View.OnFocusChangeListener
abstract void onFocusChange (View v, boolean hasFocus)
當焦點發生改變時觸發
觸摸事件
View.OnTouchListener
abstract boolean onTouch (View v, MotionEvent event)
產生觸摸事件
2.View類常見事件監聽器注冊方法方法
描述
void setOnClickListener(View.OnClickListener l)
注冊單擊事件
void setOnLongClickListener(View.OnLongClickListener l)
注冊長按事件
void setOnKeyListener(View.OnKeyListener l)
注冊鍵盤事件
void setOnFocusChangeListener(View.OnFocusChangeListener l)
注冊焦點改變事件
void setOnTouchListener(View.OnTouchListener l)
注冊觸摸事件
void setOnCreateContextMenuListener(View.OnCreateContextMenuListener l)
注冊上下文菜單事件
Android分析破解-秒脫360加固大法
Android相比iOS,安全問題往往比較突出,各種漏洞和破解層出不窮。對破解方法的了解,能在開發中進行預防,加強應用的安全性。本系列文章會對Android應用的破解和保
android學習二(Activity)
前面我簡單的介紹了android的一些基礎知識,當作熱身吧,接下來接觸android的四大組件的activity活動。 1.活動Activity是是一種保護用戶界面的組件
Android-Universal-Image-Loader學習筆記(3)--內存緩存
前面的兩篇博客寫了文件緩存,現在說說Android-Universal-Image-Loader的內存緩存,該內存緩存涉及到的類如圖所示 這些類的繼承關系如下圖所示:
Android仿優酷圓形菜單學習筆記分享
先來看看效果:首先來分析一下:這個菜單可以分成三個菜單:1.一級菜單(即最內圈那個菜單)2.二級菜單(即中間圈那個菜單)3.三級菜單(即最外圈那個菜單)首先,可以將這三個