李刚的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,该事件还会继承向外传播。我不理解的书中”先把焦点移动到程序界面的按钮上“是几个意思,困惑了好长时间。