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

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

 
问题描述:他的书里面第3.3基于回调事件处理Propagation的例程。是为了演示基于回调事件传播的例程序,源代码如下:
MyButton.java
  1. publicclassMyButtonextendsButton
    {
        publicMyButton(Context context ,AttributeSet set)
        {
          super(context , set);
        }
        @Override
        publicboolean onKeyDown(int keyCode,KeyEvent event)
        {
          super.onKeyDown(keyCode , event);
          Log.v("-MyButton-","the onKeyDown in MyButton");
          //返回false,表明并未完全处理该事件,该事件依然向外扩散
          return  false;
        }
    }
Propagation.java
  1. 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()
    {
         @Override
          publicboolean onKey(View source
          ,int keyCode,KeyEvent event)
          {
          //只处理按下键的事件
          if(event.getAction()==KeyEvent.ACTION_DOWN)
             {
                Log.v("-Listener-","the onKeyDown in Listener");
             }
          // 返回false,表明该事件会向外传播
         return false;
          }
    });
    }
  2. //重写onKeyDown方法,该方法可监听它所包含的所有组件的按键被按下事件
  3. @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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值