2.1.1 检测软键盘

手机上的输入按键一般不另外处理,直接由系统按照默认情况操作。有时为了改善用户体验,需要让App拦截按键事件,并进行额外处理。譬如使用编辑框有时要监控输入字符中的回车键,一旦发现用户敲了回车键,就将焦点自动移到下一个控件,而不是在编辑框中输入回车换行。拦截输入字符可通过注册文本观测器TextWatcher实现,但该监听器只适用于编辑框控件,无法用于其他控件。因此,若想让其他控件也能监听按键操作,则要另外调用控件对象的setOnKeyListener方法设置按键监听器,并实现监听器接口OnKeyListener的onKey方法。

监控按键事件之前,首先要知道每个按键的编码,这样才能根据不同的编码值进行相应的处理。按键编码的取值说明见表2-1。注意,监听器OnKeyListener只会检测控制键,不会检测文本键(字母、数字、标点等)。

表2-1 按键编码的取值说明

实际监控结果显示,每次按下控制键时,onKey方法都会收到两次重复编码的按键事件,这是因为该方法把每次按键都分成按下与松开两个动作,所以一次按键变成了两个按键动作。解决这个问题的办法很简单,就是只监控按下动作(KeyEvent.ACTION_DOWN)的按键事件,不监控松开动作(KeyEvent.ACTION_UP)的按键事件。

下面是使用软键盘监听器的示例代码:

(完整代码见event\src\main\java\com\example\event\KeySoftActivity.java)

上述代码的按键效果如图2-1所示。虽然按键编码表存在主页键、任务键、电源键的定义,但这3个键并不开放给普通App,普通App也不应该拦截这些按键事件。

图2-1 软键盘的检测结果