BlackBerry按键捕捉分析
protected boolean keyDown(int keycode, int time) {System.out.println("Screen1.keyDown():"+keycode);return true;}
?此方法返回true,那么表示当前key事件由Screen处理,不会再往下传递给子组件。如果返回false则反之。
?
如果Screen或者父组重写了捕捉key事件的方法,并且返回true,那么子组件是接收不到消息的。
?
关于keyDown和keyChar两个方法。keyDown优先于keyChar,如果一个组件中这个两个方法同时被重写,并且keyDown返回了true,那么keyChar是不能被调用的。
?
请看代码:
?
import net.rim.device.api.ui.Keypad;import net.rim.device.api.ui.UiApplication;import net.rim.device.api.ui.component.ActiveRichTextField;import net.rim.device.api.ui.container.MainScreen;/** * @site http://androidos.cc http://mdev.cc * @author SinFrancis Wong * @since 2009-12-09 * */public class Main extends UiApplication {public Main() {pushScreen(new Screen1());}public static void main(String[] args) {Main m = new Main();m.enterEventDispatcher();}}class Screen1 extends MainScreen {ActiveRichTextField f;public Screen1() {f = new ActiveRichTextField("catch key....") {protected boolean keyChar(char c, int status, int time) {//keyChar方法似乎捕捉不到menu按键事件,可以用keyDown捕捉System.out.println(".keyChar():"+c);if (c == Keypad.KEY_BACKSPACE) {//捕捉Back space键f.setText("catch the KEY_BACKSPACE key...");return true;} else if (c == Keypad.KEY_ESCAPE) {//捕捉back键f.setText("catch the BACK key...");return true;} else {f.setText("catch other key value is :" + c);return true;}}protected boolean keyDown(int keycode, int time) {if (keycode == 268566528) {//menu的int值f.setText("catch the MENU key...");}System.out.println(".keyDown():"+keycode);return false;}};add(f);}protected boolean keyDown(int keycode, int time) {System.out.println("Screen1.keyDown():"+keycode);return false;//交给子组件处理}}?
?
?
以上代码在BB 9500机器上测试是正常捕捉按键事件的。
如果将最后的一段keyDown代码返回true,点击是没有任何反应得(在debug模式下能看到打印的消息),因为消息没有往下传递,全部被Screen消耗掉了。
?
protected boolean keyDown(int keycode, int time) {System.out.println("Screen1.keyDown():"+keycode);return true;//交给子组件处理}
?
?
?
?