首页 > 代码库 > 自定义Button,复写里面的onKeyDown,不起作用

自定义Button,复写里面的onKeyDown,不起作用

李刚的Android疯狂讲义真是“疯狂”,浪费了3天时间,到底是他的代码有问题,还是怎么的不得而知。

问题描述:他的书里面第3.3基于回调事件处理Propagation的例程。是为了掩饰基于回调事件传播的例程序,源代码如下:
MyButton.java
  1. public class MyButton extends Button
  2. {
  3. public MyButton(Context context , AttributeSet set)
  4. {
  5. super(context , set);
  6. }
  7. @Override
  8. public boolean onKeyDown(int keyCode, KeyEvent event)
  9. {
  10. super.onKeyDown(keyCode , event);
  11. Log.v("-MyButton-" , "the onKeyDown in MyButton");
  12. //返回false,表明并未完全处理该事件,该事件依然向外扩散
  13. return false;
  14. }
  15. }
Propagation.java
  1. public class Propagation extends Activity
  2. {
  3. @Override
  4. public void onCreate(Bundle savedInstanceState)
  5. {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. MyButton bn = (MyButton)findViewById(R.id.bn);
  9. //bn.setFocusable(true);
  10. bn.requestFocus();
  11. bn.setFocusableInTouchMode(true);
  12. //为bn绑定事件监听器
  13. bn.setOnKeyListener(new OnKeyListener()
  14. {
  15. @Override
  16. public boolean onKey(View source
  17. , int keyCode, KeyEvent event)
  18. {
  19. //只处理按下键的事件
  20. if (event.getAction() == KeyEvent.ACTION_DOWN)
  21. {
  22. Log.v("-Listener-" , "the onKeyDown in Listener");
  23. }
  24. // 返回false,表明该事件会向外传播
  25. return false;
  26. }
  27. });
  28. }
  29. //重写onKeyDown方法,该方法可监听它所包含的所有组件的按键被按下事件
  30. @Override
  31. public boolean onKeyDown(int keyCode, KeyEvent event)
  32. {
  33. super.onKeyDown(keyCode , event);
  34. Log.v("-Activity-" , "the onKeyDown in Activity");
  35. //返回false,表明并未完全处理该事件,该事件依然向外扩散
  36. return false;
  37. }
  38. }
    MyButton继承了Button,并重写了onKeyDown方法,这个方法是在控件有焦点的情况下,当组件上按下某个按键触发该方法,这点很重要,
类似的还有OnkeyUp和OnKeyPress。这里涉及到一个焦点问题。
    那么什么是焦点问题:焦点可以理解为我们正在操作的对象,焦点在这里,就可操作。实际上这个MyButton是在Activity中的,我们程序默
认运行的时候焦点在Activity上,这就造成里面的MyButton无法操作,我是这么理解的,呵呵。所以程序要加两行的是:

    这里是不用setFocusable而用requstFocuns的原因是前者是设置是否允许此控件有获得焦点的能力,后者是请求获得焦点,一个是设置属性
,另一个是执行动作,故我们用后者,setFocunsableInTouchMode是获得焦点的方式,我们是触摸的时候获得焦点。设置好了之后,焦点定位
在了该Button上,当单击模拟器任意按键的时候,有程序是LogCat正确输出。
    本程序是为了演示:如果有任何一个事件处理方法返回了true,该事件还会继承向外传播。我不理解的书中”先把焦点移动到程序界面的按钮上“是几个意思,困惑了好长时间。





来自为知笔记(Wiz)


自定义Button,复写里面的onKeyDown,不起作用