入力方法の表示の処理

入力フォーカスが編集可能なテキスト フィールドに出入りすると、Android は必要に応じて入力方法(画面キーボードなど)を表示または非表示にします。 また、システムは、入力方法より上に UI とテキスト フィールドをどのように表示するかも決定します。たとえば、画面の垂直方向のスペースに制約がある場合、テキスト フィールドが入力方法の上のスペースをすべて占めることがあります。 ほとんどのアプリでは、このようなデフォルトの動作で十分です。

ただし、場合によっては、入力方法の表示をもっと直接的に制御し、入力方法が表示されるときのレイアウトの表示方法を指定することもできます。このレッスンでは、入力方法の表示を制御し応答する方法について説明します。

アクティビティの開始時に入力方法を表示する

Android では、アクティビティの開始時にレイアウトの最初のテキスト フィールドにフォーカスが合いますが、入力方法は表示されません。テキストの入力はアクティビティの主要なタスクではない可能性があるため、この動作は適切です。ただし、テキストの入力が実際に主要なタスク(ログイン画面など)である場合は、入力方法をデフォルトで表示することをおすすめします。

アクティビティの開始時に入力方法を表示するには、"stateVisible" 値を使用して <activity> 要素に android:windowSoftInputMode 属性を追加します。次に例を示します。

    <application ... >
        <activity
            android:windowSoftInputMode="stateVisible" ... >
            ...
        </activity>
        ...
    </application>
    

注: ユーザーのデバイスにハードウェア キーボードが接続されている場合、ソフト入力方法は表示されません。

オンデマンドで入力方法を表示する

入力方法を確実に表示したいメソッドがアクティビティのライフサイクルにある場合は、InputMethodManager を使用して表示できます。

たとえば、次のメソッドは、ユーザーが何かを入力する必要がある View を受け取り、requestFocus() を呼び出してフォーカスを移し、次に showSoftInput() を呼び出して入力方法を開きます。

Kotlin

    fun showSoftKeyboard(view: View) {
        if (view.requestFocus()) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
        }
    }
    

Java

    public void showSoftKeyboard(View view) {
        if (view.requestFocus()) {
            InputMethodManager imm = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
        }
    }
    

注: 入力方法が表示された後は、プログラムで非表示にしないでください。ユーザーがテキスト フィールドでのタスクを完了すると、システムは入力方法を非表示にします。または、ユーザーがシステム コントロール([戻る] ボタンなど)で非表示にすることもできます。

UI の対応方法を指定する

入力方法が画面に表示されると、アプリの UI が使用できるスペースは少なくなります。システムは、UI の表示領域をどのように調整するかを決定しますが、適切に調整できないことがあります。アプリの動作を最適なものにするには、残されたスペースにどのように UI を表示するかをシステムに指示する必要があります。

アクティビティで目的の処理を宣言するには、マニフェストの <activity> 要素の android:windowSoftInputMode 属性を使用して、いずれかの「adjust」値を指定します。

たとえば、使用可能なスペースに合わせてレイアウトがサイズ変更されるようにするには、"adjustResize" を使用します。そうすれば、(たとえスクロールが必要になるとしても)ユーザーはすべてのレイアウト コンテンツにアクセスできます。

    <application ... >
        <activity
            android:windowSoftInputMode="adjustResize" ... >
            ...
        </activity>
        ...
    </application>
    

調整の指定は、上記の初期入力方法の表示の指定と組み合わせることができます。

        <activity
            android:windowSoftInputMode="stateVisible|adjustResize" ... >
            ...
        </activity>
    

テキストの入力直後または入力中にユーザーがアクセスする必要があるコントロールが UI に含まれている場合、"adjustResize" の指定が重要になります。たとえば、相対レイアウトを使用して画面の下部にボタンバーを配置する場合、"adjustResize" を使用すると、レイアウトがサイズ変更されて入力方法の上にボタンバーが表示されます。