【Android Studio】自作キーボードの作成1【日本語】

Input Method Editorについて理解する必要が出てきたので、練習がてらAndroidStudioで自作キーボードを作成します。

こちらのサイトの写経です(ありがとうございます!)

上記のサイトの通りやってみたうえでの、自分なりの解釈やメモ等を残している感じです。

 

他のプログラミングに関する記事はこちら

スポンサーリンク


 

【とりあえず実装してみる】

1.AndroidStudioで新しいプロジェクトを作成します。

 

2.テンプレートはEmpty Activityを選択します。

 

3.名前(プロジェクト名)を「CustomKeyboard」にして、「Finish」します。

 

4.resフォルダに、新しくDirectoryを作成します。

 

5.Directoryの名前は「xml」にします。

 

6.先ほど作ったxmlフォルダ内に新しく「File」を作成します。

 

7.ファイル名は「method.xml」とします。

 

8.同じ要領で「keyboard.xml」ファイルも作成します。

 

9.resフォルダ内にあるlayoutフォルダに新しく「Layout resource file」を作成します。

スポンサーリンク


10.ファイル名は「keyboard_view.xml」、ルートエレメントは「Keyboard」にし、「OK」します。

 

11.javaフォルダ内にあるMainActivityクラスの名称をリネームします。

 

12.リネームする名前は「NewKeyboard」で、「Refactor」します。

 

13.manifestsフォルダ内にあるAndroidManifest.xmlを開きます。

 

そして、以下の通り編集します(コメント内は自分用メモです。参考程度に)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.customkeyboard">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <service
            android:name=".NewKeyboard"
            android:label="@string/keyboard_name"
            android:permission="android.permission.BIND_INPUT_METHOD">
            <intent-filter>
                <action android:name="android.view.InputMethod" />
            </intent-filter>

            <meta-data
                android:name="android.view.im"
                android:resource="@xml/method" />
        </service>

    </application>

    <!--
        <application
            android:allowBackup="true" バックアップを自動で行う設定
            android:icon="@mipmap/ic_launcher" アイコン指定。mipmap>ic_launcherにあるもの
            android:label="@string/app_name" applicationタグ内のlabelでアプリ一覧表示時のアプリ名指定。values/strings.xmlにあるapp_nameを指定
            android:supportsRtl="true" 右から左へのレイアウト(RTL)をサポートするかどうかを指定
            android:theme="@style/AppTheme"> テーマ指定。values/styles.xmlにあるAppThemeを指定

            <service
                android:name=".NewKeyboard" サービスのクラス名
                android:label="@string/keyboard_name" アプリ名
                android:permission="android.permission.BIND_INPUT_METHOD"> パーミッション。インプットメソッドを使うために必要。
                パーミッションとは、例えばカメラを使うアプリであれば「カメラを使うよ」みたいな、そういう宣言。
                <intent-filter>
                    <action android:name="android.view.InputMethod" />
                    インテントとは、どのアクティビティを起動させるかの指定(明示的インテント)と、
                    インテントフィルターに設定した情報からアクティビティを起動させる暗黙的インテントがある。
                    ここで、暗黙的インテントの情報としてInputMethodが呼び出されるように設定
                </intent-filter>

                <meta-data
                    android:name="android.view.im" アイテムの一意の名前
                    android:resource="@xml/method" リソースへの参照。リソースの ID はアイテムに割り当てられた値 />
            </service>

        </application>
    -->

</manifest>

 

14.res>values内にある「strings.xml」を開きます。

 

そして、以下の通り編集します。

<resources>
    <string name="app_name">CustomKeyboard</string>
    <string name="keyboard_name">NewKeyboard</string>
</resources>

 

15.res>xml内にある「method.xml」を開きます。

 

そして、以下の通り編集します。

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

<!--
    <subtype
        android:label="@string/keyboard_name" 名前
        android:imeSubtypeLocale="en_US" 言語 / 地域
        android:imeSubtypeMode="keyboard" 任意のテキスト(「keyboard」、「voice」など) />
-->

 

16.res>layout内にある「keyboard_view.xml」を開きます。

 

そして、以下の通り編集します(レイアウトをコードで編集する場合はTextタブをクリックする必要があります)

<?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="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" />

 

17.res>xml内にある「keyboard.xml」を開きます。

 

そして、以下の通り編集します。

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keyWidth="10%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="40dp">

    <Row>
        <Key android:codes="8"  android:keyLabel="1" android:keyEdgeFlags="left" />
        <Key android:codes="9"  android:keyLabel="2" />
        <Key android:codes="10" android:keyLabel="3" />
        <Key android:codes="11" android:keyLabel="4" />
        <Key android:codes="12" android:keyLabel="5" />
        <Key android:codes="13" android:keyLabel="6" />
        <Key android:codes="14" android:keyLabel="7" />
        <Key android:codes="15" android:keyLabel="8" />
        <Key android:codes="16" android:keyLabel="9" />
        <Key android:codes="7"  android:keyLabel="0" android:keyEdgeFlags="right" />
    </Row>

    <Row>
        <Key android:codes="-5" android:keyLabel="Delete" android:isRepeatable="true" />
        <Key android:codes="66" android:keyLabel="Return" android:isRepeatable="true" />
    </Row>

</Keyboard>

 

18.最後に、java内にある「NewKeyboard」クラスを開きます。

 

そして、以下の通り編集します。

package com.sample.customkeyboard;

import android.os.Bundle;
import android.util.Log;
import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;

public class NewKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener {

    private KeyboardView keyboardView;
    private Keyboard keyboard;

    //初回だけ呼ばれる
    @Override
    public void onCreate() {
        super.onCreate();
    }

    //初回だけ呼ばれる
    @Override
    public View onCreateInputView() {
        super.onCreateInputView();

        keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);
        keyboard = new Keyboard(this, R.xml.keyboard);
        keyboardView.setKeyboard(keyboard);
        keyboardView.setOnKeyboardActionListener(this);
        keyboardView.setPreviewEnabled(false);
        return keyboardView;
    }

    //キーボードが表示されるたびに呼ばれるメソッド
    @Override
    public void onStartInputView(EditorInfo editorInfo, boolean restarting) {
        //なんらかの処理
    }

    //キーボードが閉じる時に呼ばれるメソッド
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    //キーを押した時
    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
        InputConnection ic = getCurrentInputConnection();
        switch (primaryCode) {
            case KeyEvent.KEYCODE_1:
                ic.commitText("1", 1);
                break;
            case KeyEvent.KEYCODE_2:
                ic.commitText("2", 1);
                break;
            case KeyEvent.KEYCODE_3:
                ic.commitText("3", 1);
                break;
            case KeyEvent.KEYCODE_4:
                ic.commitText("4", 1);
                break;
            case KeyEvent.KEYCODE_5:
                ic.commitText("5", 1);
                break;
            case KeyEvent.KEYCODE_6:
                ic.commitText("6", 1);
                break;
            case KeyEvent.KEYCODE_7:
                ic.commitText("7", 1);
                break;
            case KeyEvent.KEYCODE_8:
                ic.commitText("8", 1);
                break;
            case KeyEvent.KEYCODE_9:
                ic.commitText("9", 1);
                break;
            case KeyEvent.KEYCODE_0:
                ic.commitText("0", 1);
                break;
            case Keyboard.KEYCODE_DELETE:
                ic.deleteSurroundingText(1, 0);
                break;
            case KeyEvent.KEYCODE_ENTER:
                ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
                break;
            default:
                break;
        }
    }

    @Override
    public void onPress(int primaryCode) {
    }

    @Override
    public void onRelease(int primaryCode) {
    }

    @Override
    public void onText(CharSequence text) {
    }

    @Override
    public void swipeLeft() {
    }

    @Override
    public void swipeRight() {
    }

    @Override
    public void swipeDown() {
    }

    @Override
    public void swipeUp() {
    }

}

スポンサーリンク


これで作成が終了です。

試しにエミュレーターで起動してみます。

……の前に、キーボードは特殊なアプリなので、エミュレーター起動時にアプリが起動しないような設定をします。

エミュレーターの設定「Edit Configurations…」をクリックします(AndroidStudioのバージョンによって恐らく場所が変わりますが、画面上部のメニューバーにあるはず)

 

Lauchを「Nothing」に変更し、「OK」します。

 

その後、エミュレーターを起動した後に設定をクリックします(日本語化してます。もし日本語化してなければ「Setting」とか、そんな感じだったかな)

 

システムを選びます。

 

言語と入力を選択します。

 

仮想キーボードを選択します。

 

キーボードを管理を選択します。

 

先ほど作成した「NewKeyboard」を有効にします。

 

これで使えるようになります。

試しに適当に文字を入力する場所にカーソルを当て、キーボードを出します。

キーボードを出したら、画面右下のアイコンをクリックします。

 

NewKeyboardを選択します。

 

これで自作キーボードの動きが確認できます。

 

次回は、どういった動きになっているのかについて、もう少し詳細にみていこうかと思います。

次回はこちら

 

他のプログラミングに関する記事はこちら

スポンサーリンク