Android事件處理(二)
2、基於回調事件的處理
如果說事件監聽是一種委託的事件處理,那麼回調機制恰好相反,對於回調機制事件處理模型來說,事件源和時間監聽器是統一的,或者說事件監聽器完全消失了,當組件激發某個事件時,組件自己特定的方法會負責去處理,
而Java又是一個靜態語言,我們無法爲某個對象動態添加方法,因此只能繼承GUI組件類,並重寫該類的事件處理方法來實現。
①自定義UI界面來時現基於回調的時間處理機制。
public class MyButton extends Button
{
public MyButton(Context context, AttribueSet set)
{
super(context,set);
}
public boolean onKeyDown(int keyCode,KeyEvent event)
{
super.onKeyDown(keyCode,event);
Log.v("sfs","sdf");
return true; // 返回true表示該事件完全處理,不會傳播出去,如果false,表示爲完全處理,return false
}
}
在UI 界面添加自定義的Button
<com.sim.demo.MyButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點擊我"
/>
3、事件傳播
某組件上發生的事件不僅激發了該組件上的回調方法,也會觸發該組件所在的Activity的回調方法----只要事件能傳播到該Activity
public class Propagation extends Activity
{
puglic void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
bt = findViewById(R.id.bn);
bt.setOnKeyListener(new OnKeyListener()
{
public boolean onKey(View source,int keyCode,KeyEvent event)
{
if(event.getAction()==KeyEvent.ACTION_DOWN){
Toast.makeText(getApplicationContext(),
"觸發了點擊效果",
Toast.LENGTH_SHORT).show();
}
return false; //會向外擴散
}
});
public boolean onKeyDown(int keyCode,KeyEvent event)
{
Toast.makeText(getApplicationContext(),
"觸發了點擊效果",
Toast.LENGTH_SHORT).show();
return true;
}
}
上面就會觸發兩次效果
④對比Android兩種事件處理方式?
不難發現基於監聽事件處理模型具有更大的優勢,
基於監聽的事件模型分工更明確,事件源,事件監聽由兩個類分工實現,因此具有更好的課維護性。所以通常優先考慮基於監聽的事件處理