android 中Activity跟View對于鍵盤的監聽,主要有以下幾個方法
//按鍵按下 public boolean onKeyDown(int keyCode, KeyEvent event) {} //按鍵彈起 public boolean onKeyUp(int keyCode, KeyEvent event) {} //常按 public boolean onKeyLongPress(int keyCode, KeyEvent event) {}
我們今天先看的就是按下、彈起兩個事件,在activity跟view兩者之間的傳遞關系。
我們先看如下的測試代碼
首先是自定義view,重寫了onkeyDown 跟onkeyUp兩個方法
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubboolean a = super.onKeyDown(keyCode, event);Log.e("123", "view_onkeydown|a===" + a);return a;}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {// TODO Auto-generated method stubboolean a = super.onKeyUp(keyCode, event);Log.e("123", "view_onkeyup|a==" + a);return a;}
接下來是在activity中重寫了上面兩個方法
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.e("123", "activity_onkeydown");return super.onKeyDown(keyCode, event);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {// TODO Auto-generated method stubLog.e("123", "activity_onkeyup");return super.onKeyUp(keyCode, event);}
然后我們打下log
?
1.當焦點不在自定義view上的時候
1 00-01 08:59:54.755: E/123(9250): activity_onkeydown2 01-01 08:59:54.951: E/123(9250): activity_onkeyup3 01-01 08:59:55.757: E/123(9250): activity_onkeydown4 01-01 08:59:55.964: E/123(9250): activity_onkeyup
2.當焦點在view上的時候
1 01-01 09:01:14.914: E/123(9250): view_onkeydown|a===true2 01-01 09:01:15.043: E/123(9250): view_onkeyup|a==false3 01-01 09:01:15.044: E/123(9250): activity_onkeyup4 01-01 09:01:16.451: E/123(9250): view_onkeydown|a===true5 01-01 09:01:16.614: E/123(9250): view_onkeyup|a==false6 01-01 09:01:16.615: E/123(9250): activity_onkeyup
總結:
從上面的log結果,我們能得到以下兩個知識點
1.控件對鍵盤的監聽,只有當控件獲得焦點的時候,才能夠起效果,activity對控件的監聽是一直存在的
2.如果控件獲得了焦點,那么監聽順序是,先view,后activity
3.如果view返回為ture,那么activity相應的監聽就不會接受到按鍵事件