自定义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)

时间: 2024-11-29 00:07:41

自定义Button,复写里面的onKeyDown,不起作用的相关文章

vue2.0 watch里面的 deep和immediate作用

deep,默认值是 false,代表是否深度监听.immediate:true代表如果在 wacth 里声明了之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行. computed: { btnObj() { const { sign_img, check } = this return { sign_img, check } } }, watch: { btnObj: { handler: function(newVal,oldVa

android中样式和自定义button样式

1)自定义button样式 一.采用图片方式 首先新建Android XML文件,类型选Drawable,根结点选selector,自定义一个文件名. 随后,开发环境自动在新建的文件里加了selector结点,我们只需要在selector结点里写上三种状态时显示的背景图片(按下.获取焦点,正常)即可.具体如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="

form里面的action和method(post和get的方法)使用

一.form里面的action和method的post使用方法 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="formsubmitpost.aspx.cs" Inherits="formsubmitpost" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh

Firemonkey 自定义Button的Style

这篇文章模仿HTML中基于CSS的Button,通过Style实现自定义样式的Button. 前言 主要模仿的CSS代码如下: CSS Code 123456789101112131415161718192021222324252627   a.button{    text-align:center;    display:block;    width:50px;    color:#fff;    text-decoration:none;    font-weight:700;    l

iOS_Swift初识之使用三种回调方式自定义Button

最近在学习Swift ,发现青玉伏案大神早期用OC写的一篇博客--IOS开发之自定义Button(集成三种回调模式)  很适合用来熟悉Swift的回调方式,于是我就用Swift翻版了一下,具体实现原理就不多说了,主要贴上Swift的代码给大家看看.由于刚开始了解Swift,有使用不恰当的地方请轻拍.... 上代码: 1.新建一个xib,拖一个UIView到界面上,绑定上自定义的UIView类,拖一个UILabel到view上,写上Button假装是个UIButton:并将label拖到代码当中

vue.js 2.x 版本script里面的dom被过滤,从而获取不到dom字符串的解决方案

做项目中 vue.js 在1.x版本切换的到2.x版本的时候遇到了一个问题就是说,1.x版本实例化之后 script 里面的dom 字符串不会被过滤掉,但是2.x版本之后就会被过滤例如: 1.x 版本被实例化之后的script 内容 2.x 版本被实例化之后的script 内容 这样我们在获取 id="sh" 内容的时候就无法获取到dom结构,很多时候我们想使用这些dom结构,怎么办呢? 于是乎,经过测试及文档的查看,考虑到了,那么如果还没被完全实例化之后,我们就去获取它,这样我们就能

如何获取listview里面的edittext或者RadioGroup的值,涉及到引发的混乱现象

最近要实现从数据库读数据,该数据对应listview的item布局里面的RadioButton值,并且item布局里面还有EditText的控件. 如何将每一条对应的listview对应值获取出来呢? 实现原理是在作为ArrayAdapter的参数的数据源对象(如数组,集合),举例: ArrayList<MyClass> arrayList = new ArrayList<MyClass>(); ArrayAdapter arrayAdapter = new ArrayAdapte

IOS开发之自定义Button(集成三种回调模式)

前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调,Block回调.具体的内容请参考之前的博客:“Objective-C中的Block回调模式”,“Target-Action回调模式”,“Objective-C中的委托(代理)模式”.在接下来要封装的button中将要用到上面的知识点.之前在做新浪微博中的Cell的时候用到了Block回调来确定是那

友盟推送里面的Alias怎么用?可以理解成账号吗?

友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档写着Alias是和设备绑定的,感觉Alias算不上是严格意义的账号.不知道其它集成过友盟推送的兄弟们是否有类似的需求,是否可以通过友盟推送提供的Alias功能来满足我们的需求? 作者:沙漠链接:http://www.zhihu.com/question/31882775/answer/5425406