入力フォーカスが編集可能なテキスト フィールド内外に移動すると、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);