Android2.2的Phone界面会有软键盘弹出!
原因是
mDigits.setKeyListener(DialerKeyListener.getInstance());mDigits.setInputType(InputType.TYPE_CLASS_PHONE);
把这两行去掉并加上一句mDigits.setInputType(InputType.TYPE_NULL);就行了!
Phone那个拨号界面对应的是Contacts下的TwelveKeyDialer.java
本身采用的是
playTone(ToneGenerator.TONE_DTMF_1);//生音是否显示keyPressed(KeyEvent.KEYCODE_1);//输入的数字
mHaptic.vibrate();//震动 KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); mDigits.onKeyDown(keyCode, event);//keycode对应的就是KeyEvent.KEYCODE_1
keyCode对应的去取对应的值!这个值对应的在MultiTapKeyListener.java中有定义!
static { sRecs.put(KeyEvent.KEYCODE_1, ".,1!@#$%^&*:/?'=()"); sRecs.put(KeyEvent.KEYCODE_2, "abc2ABC"); sRecs.put(KeyEvent.KEYCODE_3, "def3DEF"); sRecs.put(KeyEvent.KEYCODE_4, "ghi4GHI"); sRecs.put(KeyEvent.KEYCODE_5, "jkl5JKL"); sRecs.put(KeyEvent.KEYCODE_6, "mno6MNO"); sRecs.put(KeyEvent.KEYCODE_7, "pqrs7PQRS"); sRecs.put(KeyEvent.KEYCODE_8, "tuv8TUV"); sRecs.put(KeyEvent.KEYCODE_9, "wxyz9WXYZ"); sRecs.put(KeyEvent.KEYCODE_0, "0+"); sRecs.put(KeyEvent.KEYCODE_POUND, " "); };
根据这个MultiTapKeyListener.java的注释
/** * This is the standard key listener for alphabetic input on 12-key * keyboards. You should generally not need to instantiate this yourself; * TextKeyListener will do it for you. */
说明实际是由TextKeyListener.java来控制的!
@Override public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) { KeyListener im = getKeyListener(event); return im.onKeyDown(view, content, keyCode, event); }
KeyListener 接口对应的返回实例在这里类型有两种!
private KeyListener getKeyListener(KeyEvent event) { KeyCharacterMap kmap = KeyCharacterMap.load(event.getKeyboardDevice()); int kind = kmap.getKeyboardType(); if (kind == KeyCharacterMap.ALPHA) { return QwertyKeyListener.getInstance(mAutoText, mAutoCap); } else if (kind == KeyCharacterMap.NUMERIC) { return MultiTapKeyListener.getInstance(mAutoText, mAutoCap); } return NullKeyListener.getInstance(); }
/** * Returns [email protected] #NUMERIC}, [email protected] #PREDICTIVE} or [email protected] #ALPHA}. */ public int getKeyboardType() { return getKeyboardType_native(mPointer); }
private static native int getKeyboardType_native(int ptr);返回NUMERIC数值类型或ALPHA希腊字母类型或PREDICTIVE这个返回的实际就是空的类型.
最后这个值是怎么取出来的列!已返回QwertyKeyListener.getInstance(mAutoText, mAutoCap);为例。
在QwertyKeyListener的onKeyDown方法中的
int i = event.getUnicodeChar(getMetaState(content));
public int getUnicodeChar(int meta) { return KeyCharacterMap.load(mDeviceId).get(mKeyCode, meta); }
private static native char get_native(int ptr, int keycode, int meta);
键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout
对于每一个键盘设备xxx,设置系统属性android.keylayout.xxx,如果没有为自己的硬件设备创建一个特定的设备,Android将去读/system/usr/keylayout/qwerty.kl这个配置文件。
key 399 GRAVEkey 2 1key 3 2key 4 3key 5 4key 6 5key 7 6key 8 7key 9 8key 10 9key 11 0key 158 BACK WAKE_DROPPEDkey 230 SOFT_RIGHT WAKEkey 60 SOFT_RIGHT WAKEkey 107 ENDCALL WAKE_DROPPEDkey 62 ENDCALL WAKE_DROPPEDkey 229 MENU WAKE_DROPPEDkey 139 MENU WAKE_DROPPEDkey 59 MENU WAKE_DROPPEDkey 127 SEARCH WAKE_DROPPEDkey 217 SEARCH WAKE_DROPPEDkey 228 POUNDkey 227 STARkey 231 CALL WAKE_DROPPEDkey 61 CALL WAKE_DROPPEDkey 232 DPAD_CENTER WAKE_DROPPEDkey 108 DPAD_DOWN WAKE_DROPPEDkey 103 DPAD_UP WAKE_DROPPEDkey 102 HOME WAKEkey 105 DPAD_LEFT WAKE_DROPPEDkey 106 DPAD_RIGHT WAKE_DROPPEDkey 115 VOLUME_UPkey 114 VOLUME_DOWNkey 116 POWER WAKEkey 212 CAMERAkey 16 Qkey 17 Wkey 18 Ekey 19 Rkey 20 Tkey 21 Ykey 22 Ukey 23 Ikey 24 Okey 25 Pkey 26 LEFT_BRACKETkey 27 RIGHT_BRACKETkey 43 BACKSLASHkey 30 Akey 31 Skey 32 Dkey 33 Fkey 34 Gkey 35 Hkey 36 Jkey 37 Kkey 38 Lkey 39 SEMICOLONkey 40 APOSTROPHEkey 14 DEL key 44 Zkey 45 Xkey 46 Ckey 47 Vkey 48 Bkey 49 Nkey 50 Mkey 51 COMMAkey 52 PERIODkey 53 SLASHkey 28 ENTER key 56 ALT_LEFTkey 100 ALT_RIGHTkey 42 SHIFT_LEFTkey 54 SHIFT_RIGHTkey 15 TABkey 57 SPACEkey 150 EXPLORERkey 155 ENVELOPE key 12 MINUSkey 13 EQUALSkey 215 AT