テキスト付きのボタンをキーに単純にマップし、それを EditText に送信するアプリケーション用に独自のカスタム キーボードを実装しました。
ボタンが押されると、最終的にこのメソッドを呼び出し、文字を追加する EditText と追加する文字を渡します。
public void keypadPress(EditText etInput, char character) {
etInput.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, getKeyEvent(character)));
}
getKeyEvent は次のようになります。
public static int getKeyEvent(char c) {
switch (c) {
case '0':
return KeyEvent.KEYCODE_0;
case '1':
return KeyEvent.KEYCODE_1;
case '2':
return KeyEvent.KEYCODE_2;
case '3':
return KeyEvent.KEYCODE_3;
case '4':
return KeyEvent.KEYCODE_4;
case '5':
return KeyEvent.KEYCODE_5;
case '6':
return KeyEvent.KEYCODE_6;
case '7':
return KeyEvent.KEYCODE_7;
case '8':
return KeyEvent.KEYCODE_8;
case '9':
return KeyEvent.KEYCODE_9;
case '-':
return KeyEvent.KEYCODE_MINUS;
case '.':
return KeyEvent.KEYCODE_PERIOD;
case ',':
return KeyEvent.KEYCODE_COMMA;
case 'x':
return KeyEvent.KEYCODE_X;
default:
return -1;
}
}
EditText タイプの入力が「数値」に設定されています。また、これは Android 4.0 以降では完全に機能しますが、「x」ボタンをクリックすると、API 8 (およびおそらくそれ以下) の「8」にマップされます。私はそれをデバッグし、KeyEvent.KEYCODE_X (または 52) を返しますが、EditText に表示されるのは数字の 8 です。
また、このキーパッドの実装で初めて画面を開くと、初めてボタンをクリックするたびに、この警告が表示されます...
10-04 01:16:29.804: W/KeyCharacterMap(8716): Can't open keycharmap file
10-04 01:16:29.804: W/KeyCharacterMap(8716): Error loading keycharmap file '/system/usr/keychars/touchscreen-keypad.kcm.bin'. hw.keyboards.0.devname='touchscreen-keypad'
10-04 01:16:29.804: W/KeyCharacterMap(8716): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
その後は警告なしです。