本節(jié)引言
1.什么是方法回調(diào)?文字表述:
舉個(gè)簡單例子:
2.Android回調(diào)的事件處理機(jī)制詳解:在Android中基于回調(diào)的事件處理機(jī)制使用場景有兩個(gè): 1)自定義view
常見View組件的回調(diào)方法: android為GUI組件提供了一些事件處理的回調(diào)方法,以View為例,有以下幾個(gè)方法
另外,這了解釋下什么是軌跡球,不過用處不大,在以前黑莓的手機(jī)上可以看到;當(dāng)我們?yōu)g覽網(wǎng)頁的的時(shí)候 ,可以把軌跡球看作鼠標(biāo),不過這樣的操作,我們用onTouchEvent就可以解決了,而且不夠美觀,所以現(xiàn)在 用的很好,基本不用,如果你有興趣想看看的話,可以在原始Android模擬器按f6就可以看到了! 代碼示例: 我們自定義一個(gè)MyButton類繼承Button類,然后重寫onKeyLongPress方法; 接著在xml文件中通過全限定類名調(diào)用自定義的view 效果圖如下: 一個(gè)簡單的按鈕,點(diǎn)擊按鈕后觸發(fā)onTouchEvent事件,當(dāng)我們按模擬器上的鍵盤時(shí), 按下觸發(fā)onKeyDown,離開鍵盤時(shí)觸發(fā)onKeyUp事件!我們通過Logcat進(jìn)行查看! 實(shí)現(xiàn)代碼: MyButton.java public class MyButton extends Button{ private static String TAG = "呵呵"; public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } //重寫鍵盤按下觸發(fā)的事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode,event); Log.i(TAG, "onKeyDown方法被調(diào)用"); return true; } //重寫彈起鍵盤觸發(fā)的事件 @Override public boolean onKeyUp(int keyCode, KeyEvent event) { super.onKeyUp(keyCode,event); Log.i(TAG,"onKeyUp方法被調(diào)用"); return true; } //組件被觸摸了 @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); Log.i(TAG,"onTouchEvent方法被調(diào)用"); return true; } } 布局文件: <RelativeLayout xmlns:android="http://schemas./apk/res/android" xmlns:tools="http://schemas./tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyActivity"> <example.jay.com.mybutton.MyButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鈕"/> 代碼解析:
2)基于回調(diào)的事件傳播:綜上,就是如果是否向外傳播取決于方法的返回值是時(shí)true還是false; 代碼示例: public class MyButton extends Button{ private static String TAG = "呵呵"; public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } //重寫鍵盤按下觸發(fā)的事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode,event); Log.i(TAG, "自定義按鈕的onKeyDown方法被調(diào)用"); return false; } } main.xml: <LinearLayout xmlns:android="http://schemas./apk/res/android" xmlns:tools="http://schemas./tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyActivity"> <example.jay.com.mybutton.MyButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自定義按鈕" android:id="@+id/btn_my"/> </LinearLayout> MainActivity.java: public class MyActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Button btn = (Button)findViewById(R.id.btn_my); btn.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_DOWN) { Log.i("呵呵","監(jiān)聽器的onKeyDown方法被調(diào)用"); } return false; } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode, event); Log.i("呵呵","Activity的onKeyDown方法被調(diào)用"); return false; } } 運(yùn)行截圖: 結(jié)果分析: 從上面的運(yùn)行結(jié)果,我們就可以知道,傳播的順序是: 監(jiān)聽器--->view組件的回調(diào)方法--->Activity的回調(diào)方法了; 本節(jié)小結(jié)
|
|