Software KeyboardをActivityに配置する

android-sdkにSoftKeyboardというソフトキーボードのサンプルがあったので見てみました。キーボードアプリを作るのは大変そうだけど、仕組みは単純で、基本的にServiceからKeyboardViewというビューを作り画面に表示するだけです。
このKeyboardViewはViewを継承して作られてるクラスなので、普通にActivity上に配置出来るよね?と思いやってみました。結果、KeyboardViewを作成して配置するだけで動きました。

 Keyboard keyboard = new Keyboard(this, R.xml.qwerty);
 KeyboardView keyboardView = new KeyboardView(this,null);
 keyboardView.setKeyboard(keyboard);
 keyboardView.setOnKeyboardActionListener(this);
 layout.addView(keyboardView);

1行目、xmlで定義したキーボードの配列を作ります。↓sdkのサンプルのを抜粋

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="55dip"
    >
    <Row>
        <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
        <Key android:codes="119" android:keyLabel="w"/>
        <Key android:codes="101" android:keyLabel="e" />
        <Key android:codes="114" android:keyLabel="r"/>
        <Key android:codes="116" android:keyLabel="t"/>
        <Key android:codes="121" android:keyLabel="y"/>
        <Key android:codes="117" android:keyLabel="u"/>
        <Key android:codes="105" android:keyLabel="i"/>
        <Key android:codes="111" android:keyLabel="o"/>
        <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
    </Row>

2行目と3行目でKeyboardViewクラスを作り、上で作ったKeyboardを設定します。4行目でリスナーを設定して、キーが押された時、などのイベントを取得出来ます。

public class Main extends Activity implements KeyboardView.OnKeyboardActionListener {

Activityにインターフェースを設定して、10個近いメソッドを実装しました。キーボード入力を受け取るonKeyの例

    public void onKey(int primaryCode, int[] keyCodes) {
        if(primaryCode == Keyboard.KEYCODE_DELETE ){
            string.deleteCharAt(string.length()-1);
        }else{
            string.append((char)primaryCode);
        }
        tv.setText(string);
    }

これだけでActivityにキーボードを表示し、TextViewに対して文字入力が出来るようになりました。Androidの実装って素晴らしいです。

高機能なViewなので、キーボード以外にも使い道がありそうですね。Androidのソフトキーボードはユーザーが自由に選択出来るので素敵ですが、その分アプリからのハンドリングは難しいです。キーボード自体を自前で持ってしまうのもありかも。