入力方法の表示を処理する

入力フォーカスが編集可能なテキスト フィールド内外に移動すると、Android は 画面キーボードなどの入力が非表示になり、 あります。上部に UI とテキスト フィールドをどのように表示するかもシステムが決定します。 確認します。たとえば、画面上の垂直方向のスペースが 制約がある場合、テキスト フィールドは入力方法の上にあるすべてのスペースを埋める可能性があります。

ほとんどのアプリでは、これらのデフォルトの動作で十分です。場合によっては ただし、入力方法や表示 / 非表示の可視性を 与える方法です。このレッスンでは、 インプット方法の表示設定を指定します。

アクティビティの開始時にソフト キーボードを表示する

Android ではレイアウト内の最初のテキスト フィールドがフォーカスされますが、 ソフト キーボードは表示されません。この動作は適切です。 これは、テキストの入力がアクティビティの主要タスクではない場合があるためです。ただし、 ログイン画面などでテキストの入力が主なタスクである場合は、 デフォルトでソフトキーボードが表示されるようにします

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

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

UI の対応方法を指定する

画面にソフト キーボードを表示すると、スペースの表示領域が減ります。 アプリの UI で使用できるよう設定できます表示位置の調整方法はシステムが 正しく機能しない可能性があります。最適な動作を保証するには でシステムによる UI の表示方法を できます。

アクティビティで希望する処理を宣言するには、 マニフェストの <activity> 要素内の android:windowSoftInputMode 属性 「調整」オプションを使用できます。

たとえば、使用可能なサイズに合わせてレイアウトのサイズが自動的に変更されるようにするには、 レイアウト コンテンツへのアクセスが維持され、 スクロールが必要な場合は "adjustResize" を使用します。

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

調整の指定は、初期ソフト キーボードと組み合わせることができます。 visibility の仕様を変更します。

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

"adjustResize" を指定することは、UI に テキスト入力の直後または実行中に、アクセスが必要になる可能性があります。対象 たとえば、相対レイアウトを使用してページの下部にボタンバーを配置する場合などです。 "adjustResize" を使用すると、レイアウトのサイズが変更され、ボタンバーが表示されます。 キーボードの上にあります。

ソフト キーボードをオンデマンドで表示する

アクティビティのライフサイクルにメソッドがあり、 入力方法が表示されている場合は、 InputMethodManager 表示されます。

たとえば、次のメソッドは ユーザーが期待される View 何かを入力する、 requestFocus() をプレゼント 次に、showSoftInput() を呼び出して入力メソッドを開きます。

Kotlin

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

Java

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

ソフト キーボードを確実に表示する

アクティビティの開始時など、特定の状況では、 InputMethodManager.showSoftInput() を使用してソフト キーボードを表示する ソフトウェア キーボードがユーザーに表示されないことがあります。

showSoftInput() 使用時のソフト キーボードの表示が依存している 次の条件が満たされます

  • ビューは、あらかじめソフトウェア キーボードに接続されている必要があります。(つまり、 ウィンドウにフォーカスが必要で、エディタに 使用してビューのフォーカスを View.requestFocus())。

  • 公開設定はandroid:windowSoftInputModeの影響も受ける場合があります。 属性と showSoftInput() で使用されるフラグ。

アクティビティの開始時などの特定のユースケースでは、 指定することもできますシステムはそのビューを ソフトウェア キーボードに接続されている場合は、showSoftInput() 呼び出しを無視します。 ソフト キーボードはユーザーに表示されません。

ソフトウェア キーボードを確実に表示するには、次のコマンドを使用します。 次の代替手段があります。

  • (推奨) WindowInsetsControllerCompat を使用します。このオブジェクト Activity.onCreate() の間、ソフト キーボードを表示します。 追加します。コールは時間枠後に予約されることが保証されます。 確認します。

Kotlin

editText.requestFocus()
WindowCompat.getInsetsController(window, editText)!!.show(WindowInsetsCompat.Type.ime())

Java

editText.requestFocus();
WindowCompat.getInsetsController(getWindow(), editText).show(WindowInsetsCompat.Type.ime());
  • 実行可能なオブジェクトを送信する。これにより、アプリは通知を受信するまで待機し、 呼び出す前の View.onWindowFocusChanged() からのウィンドウ フォーカス イベント showSoftInput()

Kotlin

class MyEditText : EditText() {
  ...
  override fun onWindowFocusChanged(hasWindowFocus: Boolean) {
    if (hasWindowFocus) {
      requestFocus()
      post {
        val imm: InputMethodManager = getSystemService(InputMethodManager::class.java)
        imm.showSoftInput(this, 0)
      }
    }
  }
}

Java

public class MyEditText extends EditText {
  ...
  @Override
  public void onWindowFocusChanged(boolean hasWindowFocus) {
    if (hasWindowFocus) {
      requestFocus();
      post(() -> {
        InputMethodManager imm = getSystemService(InputMethodManager.class);
        imm.showSoftInput(this, 0);
      });
    }
  }
}

ランタイムの可視性フラグを慎重に扱う

ソフト キーボードの表示を実行時に切り替える場合は、特定の値を渡さないように注意してください。 それらのメソッドにフラグ値を渡しています。たとえば、アプリケーションが 通話中にソフト キーボードが表示される Activity.onCreate()View.getWindowInsetsController().show(ime()) アクティビティが開始されたら、アプリケーション デベロッパーは、 SOFT_INPUT_STATE_HIDDEN または SOFT_INPUT_STATE_ALWAYS_HIDDEN フラグ ソフト キーボードが突然非表示になった場合に備えておくことをおすすめします。

通常、システムはソフト キーボードを自動的に非表示にします

ほとんどの場合、システムはソフト キーボードを非表示にします。この 次のいずれかになります。

  • ユーザーがテキスト フィールドにタスクを入力します。
  • ユーザーが「戻る」キーを押すか、「戻る」ナビゲーションでスワイプ ジェスチャーを行います。
  • ユーザーが別のアプリに移動し、そのアプリが SOFT_INPUT_STATE_HIDDEN フラグまたは SOFT_INPUT_STATE_ALWAYS_HIDDEN フラグ ビューがフォーカスを取得したとき。
で確認できます。

以前のシステム動作に基づいてソフト キーボードを手動で非表示にする

次のような状況では、アプリでソフト キーボードを手動で非表示にする必要があります。 たとえば、テキスト フィールドがフォーカスを失った場合、 View.OnFocusChangeListener.onFocusChange。この手法は慎重に使用してください 、ソフト キーボードを閉じると、ユーザー エクスペリエンスが突然低下します。

アプリでソフト キーボードを手動で非表示にする場合は、 ソフト キーボードは明示的または暗黙的に示されました。

  • ソフト キーボードは、次の日付の後に明示的に表示されたと見なされます。 showSoftInput() への呼び出し。

  • 逆に、ソフト キーボードは暗黙のうちに 次の条件のいずれかを満たす必要があります

    • 適用中にソフト キーボードが表示されました android:windowSoftInputMode
    • アプリが SHOW_IMPLICIT を次に渡しました: showSoftInput()

通常、hideSoftInputFromWindow() は、設定に関係なく、ソフト キーボードを非表示にします。 リクエスト方法(ただし、HIDE_IMPLICIT_ONLY を使用) 暗黙的にリクエストされたソフト キーボードの非表示のみに制限できます。

ソフト キーボードの上にダイアログまたはオーバーレイ ビューを表示する

状況によっては、エディタ アクティビティで編集不可のオブジェクトを作成し、 ダイアログやオーバーレイ ウィンドウが表示されます。

アプリにはいくつかのオプションがあります。以降のセクションで説明します。

要するに、ソフト キーボードのウィンドウ フラグを正しく処理するようにします。 次の条件を満たすようにウィンドウをターゲティングする 垂直(Z レイヤ)の順序付けに関しては

  • フラグなし(通常の場合): ソフト キーボード レイヤの背後にあり、テキストを受信できます。
  • FLAG_NOT_FOCUSABLE : ソフト キーボード レイヤに表示されますが、テキストは受信できません。
  • FLAG_ALT_FOCUSABLE_IM : ソフト キーボード レイヤの上にあります。フォーカスはできますが、 使用できます。また、その下位にあるすべてのビューが 使用できます。これは、テキストを使用しないアプリのダイアログを表示するのに便利です。 ソフト キーボード レイヤの上に置くことができます。
  • FLAG_NOT_FOCUSABLE および FLAG_ALT_FOCUSABLE_IM : ソフト キーボード レイヤの背後にありますが、テキストは受信できません。
  • FLAG_NOT_FOCUSABLE および FLAG_NOT_TOUCH_MODAL : ソフト キーボードの上部で、タッチイベントを「通過」できるようにします。 ウィンドウをソフト キーボードに表示します。

ダイアログを作成する

FLAG_ALT_FOCUSABLE_IM を使用する ダイアログ ウィンドウ フラグを指定して、ダイアログをソフト キーボードの上に表示し、 ソフト キーボードがフォーカスされないようにします。

Kotlin

val content = TextView(this)
content.text = "Non-editable dialog on top of soft keyboard"
content.gravity = Gravity.CENTER
val builder = AlertDialog.Builder(this)
  .setTitle("Soft keyboard layering demo")
  .setView(content)
mDialog = builder.create()
mDialog!!.window!!
  .addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
mDialog!!.show()

Java

TextView content = new TextView(this);
content.setText("Non-editable dialog on top of soft keyboard");
content.setGravity(Gravity.CENTER);
final AlertDialog.Builder builder = new AlertDialog.Builder(this)
    .setTitle("Soft keyboard layering demo")
    .setView(content);
mDialog = builder.create();
mDialog.getWindow().addFlags(FLAG_ALT_FOCUSABLE_IM);
mDialog.show();

オーバーレイ ビューを作成する

TYPE_APPLICATION_OVERLAY を指定してオーバーレイ ビューを作成する ウィンドウ タイプ、FLAG_ALT_FOCUSABLE_IM ソフト キーボードのターゲットとするアクティビティによるウィンドウ フラグです。

Kotlin

val params = WindowManager.LayoutParams(
  width,  /* Overlay window width */
  height,  /* Overlay window height */
  WindowManager.LayoutParams.TYPE_APPLICATION, /* Overlay window type */
  WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM /* No need to allow for text input on top of the soft keyboard */
    or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,  /* Allow touch event send to soft keyboard behind the overlay */
  PixelFormat.TRANSLUCENT
)
params.title = "Overlay window"
mOverlayView!!.layoutParams = params
windowManager.addView(mOverlayView, params)

Java

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    width, /* Overlay window width */
    height, /* Overlay window height */
    TYPE_APPLICATION, /* Overlay window type */
    FLAG_ALT_FOCUSABLE_IM /* No need to allow for text input on top of the soft keyboard */
        | FLAG_NOT_TOUCH_MODAL, /* Allow touch event send to soft keyboard behind the overlay */
    PixelFormat.TRANSLUCENT);
params.setTitle("Overlay window");
mOverlayView.setLayoutParams(params);
getWindowManager().addView(mOverlayView, params);

ソフト キーボードの下にダイアログまたはビューを表示する

状況によっては、メッセージを表示するダイアログやウィンドウを 次のプロパティがあります。

  • エディタ アクティビティによってリクエストされたソフト キーボードの下に表示されます テキスト入力の影響を受けないようにすることができます。
  • ソフト キーボードのインセット サイズの変化を常に把握し、 ダイアログやウィンドウのレイアウトも調整できます。

この場合、アプリには複数の選択肢があります。以下のセクション オプションについて説明します

ダイアログを作成する

FLAG_NOT_FOCUSABLE の両方を設定してダイアログを作成する ウィンドウ フラグと FLAG_ALT_FOCUSABLE_IM ウィンドウ フラグ:

Kotlin

val content = TextView(this)
content.text = "Non-editable dialog behind soft keyboard"
content.gravity = Gravity.CENTER
val builder = AlertDialog.Builder(this)
  .setTitle("Soft keyboard layering demo")
  .setView(content)
mDialog = builder.create()
mDialog!!.window!!
  .addFlags(FLAG_NOT_FOCUSABLE or FLAG_ALT_FOCUSABLE_IM)
mDialog!!.show()

Java

TextView content = new TextView(this);
content.setText("Non-editable dialog behind soft keyboard");
content.setGravity(Gravity.CENTER);
final AlertDialog.Builder builder = new AlertDialog.Builder(this)
    .setTitle("Soft keyboard layering demo")
    .setView(content);

mDialog = builder.create();
mDialog.getWindow()
    .addFlags(FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM);
mDialog.show();

オーバーレイ ビューを作成する

オーバーレイ ビューを作成するには、FLAG_NOT_FOCUSABLE と ウィンドウ フラグと FLAG_ALT_FOCUSABLE_IM ウィンドウ フラグ:

Kotlin

val params = WindowManager.LayoutParams(
  width,  /* Overlay window width */
  height,  /* Overlay window height */
  WindowManager.LayoutParams.TYPE_APPLICATION,  /* Overlay window type */
  WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
      or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
  PixelFormat.TRANSLUCENT
)
params.title = "Overlay window"
mOverlayView!!.layoutParams = params
windowManager.addView(mOverlayView, params)

Java

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    width, /* Overlay window width */
    height, /* Overlay window height */
    TYPE_APPLICATION, /* Overlay window type */
    FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM,
    PixelFormat.TRANSLUCENT);
params.setTitle("Overlay window");
mOverlayView.setLayoutParams(params);
getWindowManager().addView(mOverlayView, params);