キーボードアプリとして、Googleのサンプルキーボードアプリを実装しました。
その際、調査のため色々といじくりまわしたので後学のためにメモを残します。
今後役に立つかは微妙ですが…私はキーボードアプリを作る気ゼロなので。
・Keyクラス
キーボードのキーの文字とポジションを描写するクラスである
qwerty.xml
<Row>
<Key android:codes="99" android:keyLabel="c"/>
<Key android:codes="118" android:keyLabel="v"/
</Row>
というqwerty.xmlがあるとすると、
キーボードの「c」を押下した場合、
KeyboardViewListenerを実装したクラスの
public void onKey(int primaryCode, int[] keyCodes) メソッドの
primaryCodeで
99
が取得できる。
また、
public boolean onKeyDown(int keyCode, KeyEvent event) メソッドの
keyCodeは
31(KeyEvent.KEYCODE_C)
が取得できる。
EditText上にカーソルがある状態でキーボードを押下すると、
onKey()
が呼ばれるようだ。
エミュレーターのキーボードを押すと
onKeyDown()
↓
translateKeyDown()
↓
onKey()
の順番で呼び出される。
onKey()以降でメイン処理が行われているようだ。
スペースキーを押すと、
onKey()
↓
sendKey()
と呼び出される。
onKey()の中では、isWordSeparator()がtrueになる。
isWordSeparatorはstrings.xmlのword_separators属性で指定している。
InputConnectionクラスのcommitTextメソッドで、word_separators属性で指定した文字を設定している。
以降は、自分のやりたかった処理。
キーボードの「a」が押された場合に、他アプリのHelloWorldを呼びだす(aの文字はテキストエリアに挿入しない)。
onKeyメソッドに以下の処理を追加した。
public void onKey(int primaryCode, int[] keyCodes) {
if (primaryCode == 97) {
// a押下
String clazz = "co.hoge.sample.Test";
Intent intent = new Intent(Intent.ACTION_MAIN);
int idx = clazz.lastIndexOf('.');
String pkg = clazz.substring(0, idx);
intent.setClassName(pkg, clazz);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else if () {
// 以降変更なし
}
}
とすると、co.hoge.sample.Testが起動する。
加えて、co.hoge.sample側のアプリのAndroidManifest.xmlファイルのIntentFilterに
android:schemeとandroid:hostを指定してやると、なお良い。
以上。
0 件のコメント:
コメントを投稿