Android向けのキーボードの書き方

こんにちは。 この記事では、Android用の独自のキーボードを作成する主なポイントを説明し、表示しようとします。 この記事は、これに遭遇したことはないが、Androidの経験がある開発者を対象としています。



著者の意見とコードは最後の手段では真実ではなく、あなたの提案と批判は大歓迎です。 また、すべてを読みたくない場合は、記事の最後にあるソースへのリンクをご覧ください。



最初に、アクティビティなしで空のAndroidプロジェクトを作成する必要があります。 その後、Androidのキーボードを記述する.xmlファイルの準備を始めましょう。



基本レイアウトファイル、keyboard.xml



これには、KeyboardViewというView Androidクラスが含まれており、キーボードの外観について説明しています。



<?xml version="1.0" encoding="utf-8"?> <android.inputmethodservice.KeyboardView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:keyPreviewHeight="35dp" android:keyPreviewLayout="@layout/preview" />
      
      





属性:





プレビューコード:



 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="@color/key_preview_background" android:textColor="@color/key_preview_text_color" android:textStyle="bold" android:textSize="25sp" />
      
      





重要な点は、バックグラウンド属性が必要です。指定しない場合、キーを押すたびにキーボードが落ちます。



レイアウトの説明



そのため、外観を説明する2つの.xmlファイルを準備しました。今度は、キーボードレイアウト自体を説明します。 このファイルをkeys_definition_ru.xmlと呼び、プロジェクトのxmlリソースに配置されます。 ファイルは非常に大きいため、ここではその一部のみを示します。



 <?xml version="1.0" encoding="utf-8"?> <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="7.5%p" android:horizontalGap="5px" android:verticalGap="0px" android:keyHeight="40dp"> <Row> <Key android:codes="-1" android:keyIcon="@drawable/ic_keyboard_capslock_white_24dp" android:keyWidth="13%p" android:keyEdgeFlags="left" /> <Key android:codes="1103" android:keyLabel="" /> <Key android:codes="1095" android:keyLabel="" /> <Key android:codes="1089" android:keyLabel="" /> <Key android:codes="1084" android:keyLabel="" /> <Key android:codes="1080" android:keyLabel="" /> <Key android:codes="1090" android:keyLabel="" /> <Key android:codes="1100" android:keyLabel="" /> <Key android:codes="1073" android:keyLabel="" /> <Key android:codes="1102" android:keyLabel="" /> <Key android:codes="-5" android:keyIcon="@drawable/ic_backspace_white_24dp" android:isRepeatable="true" android:keyEdgeFlags="right" android:keyWidth="13%p" /> </Row> </Keyboard>
      
      





属性:



すべての属性を説明するのではなく、「明白ではない」だけを説明します。





最後のファイルは、ローカリゼーションの説明(入力のサブタイプ)です。



 <?xml version="1.0" encoding="utf-8"?> <input-method xmlns:android="http://schemas.android.com/apk/res/android"> <subtype android:label="@string/subtype_en_US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" /> <subtype android:label="@string/subtype_ru_RU" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" /> </input-method>
      
      





InputMethodService-キーボードサービス



ここで、必要なすべてのxmlファイルを作成した後、 InputMethodイベントをリッスンするサービスの説明に進みます。



これを行うには、 InputMethodService継承するサービスを作成し、 KeyboardView.OnKeyboardActionListenerインターフェイスをすぐに実装します。 結果として、キーボードを幅広くカスタマイズできるようにするために必要な機能をオーバーライドおよび入力できる一連のメソッドを取得します。 ただし、ここでは基本的なポイントの例を示します。



OnCreateInputViewおよびonKeyメソッド
  @Override public View onCreateInputView() { mKeyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard, null); mKeyboard = new Keyboard(this, R.xml.keys_definition_ru); mKeyboard.setShifted(isCapsOn); //    ,     mKeyboardView.setKeyboard(mKeyboard); mKeyboardView.setOnKeyboardActionListener(this); return mKeyboardView; } @Override public void onKey(int primaryCode, int[] ints) { Log.d(TAG, "onKey " + primaryCode); InputConnection ic = getCurrentInputConnection(); playClick(primaryCode); switch (primaryCode) { case Keyboard.KEYCODE_DELETE: ic.deleteSurroundingText(1, 0); break; case Keyboard.KEYCODE_SHIFT: handleShift(); break; case Keyboard.KEYCODE_DONE: ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); break; case Keyboard.KEYCODE_ALT: handleSymbolsSwitch(); break; case Keyboard.KEYCODE_MODE_CHANGE: handleLanguageSwitch(); break; default: char code = (char) primaryCode; if (Character.isLetter(code) && isCapsOn) { code = Character.toUpperCase(code); } ic.commitText(String.valueOf(code), 1); break; } }
      
      







InputMethodServiceライフサイクルのメソッドの1つはonCreateInputViewで、その中にキーボードのビューを作成し、必要なリスナーをバインドします。



onKeyイベントは、onPressとonReleaseの間に発生し、押されたキーのコードが入力されます。



これで、すべての準備が整いました...ほとんど、マニフェストにサービスを追加することが残っています。



 <service android:name=".SimpleIME" android:label="@string/simple_ime" android:permission="android.permission.BIND_INPUT_METHOD"> <meta-data android:name="android.view.im" android:resource="@xml/method" /> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> </service>
      
      





おめでとうございます、あなたは最初のキーボードを書きました!



キーボードのソースコード (デフォルトでは大文字が含まれます)

公式ドキュメント/チュートリアル



All Articles