生活随笔
收集整理的這篇文章主要介紹了
自定义Button,复写里面的onKeyDown,不起作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
李剛的Android瘋狂講義真是“瘋狂”,浪費了3天時間,到底是他的代碼有問題,還是怎么的不得而知。
問題描述:他的書里面第3.3基于回調事件處理Propagation的例程。是為了演示基于回調事件傳播的例程序,源代碼如下: MyButton.java
publicclassMyButtonextendsButton
{publicMyButton(Context context ,AttributeSet set){super(context , set);}@Overridepublicboolean onKeyDown(int keyCode,KeyEvent event){super.onKeyDown(keyCode , event);Log.v("-MyButton-","the onKeyDown in MyButton");//返回false,表明并未完全處理該事件,該事件依然向外擴散return false;}
} Propagation.java
publicclassPropagationextendsActivity
{
@Override
publicvoid onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyButton bn =(MyButton)findViewById(R.id.bn);
//bn.setFocusable(true);
bn.requestFocus();
bn.setFocusableInTouchMode(true);
//為bn綁定事件監聽器
bn.setOnKeyListener(newOnKeyListener()
{@Overridepublicboolean onKey(View source,int keyCode,KeyEvent event){//只處理按下鍵的事件if(event.getAction()==KeyEvent.ACTION_DOWN){Log.v("-Listener-","the onKeyDown in Listener");}// 返回false,表明該事件會向外傳播return false;}
});
} //重寫onKeyDown方法,該方法可監聽它所包含的所有組件的按鍵被按下事件 @Override
publicboolean onKeyDown(int keyCode,KeyEvent event)
{super.onKeyDown(keyCode , event);Log.v("-Activity-","the onKeyDown in Activity");//返回false,表明并未完全處理該事件,該事件依然向外擴散return false;
} ? ??MyButton繼承了Button,并重寫了onKeyDown方法,這個方法是在控件有焦點的情況下,當組件上按下某個按鍵觸發該方法,這點很重要, 類似的還有OnkeyUp和OnKeyPress。這里涉及到一個焦點問題。
? ??那么什么是焦點問題:焦點可以理解為我們正在操作的對象,焦點在這里,就可操作。實際上這個MyButton是在Activity中的,我們程序默 認運行的時候焦點在Activity上,這就造成里面的MyButton無法操作,我是這么理解的,呵呵。所以程序要加兩行的是:
? ??這里是不用setFocusable而用requstFocuns的原因是前者是設置是否允許此控件有獲得焦點的能力,后者是請求獲得焦點,一個是設置屬性 ,另一個是執行動作,故我們用后者,setFocunsableInTouchMode是獲得焦點的方式,我們是觸摸的時候獲得焦點。設置好了之后,焦點定位 在了該Button上,當單擊模擬器任意按鍵的時候,有程序是LogCat正確輸出。 ? ??本程序是為了演示:如果有任何一個事件處理方法返回了true,該事件還會繼承向外傳播。我不理解的書中”先把焦點移動到程序界面的按鈕上“是幾個意思,困惑了好長時間。 ? ?
轉載于:https://www.cnblogs.com/fruitbolgs/p/4160862.html
總結
以上是生活随笔為你收集整理的自定义Button,复写里面的onKeyDown,不起作用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。