2011年1月26日水曜日

Android Tips keyboardの挙動メモ

keyboardの特定ボタンを押した場合に、特定のアプリを呼び出すという実装を試しました。
キーボードアプリとして、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 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...