テキスト フィールドにフォーカス

ユーザーがハードウェア キーボード、D-pad、ロータリー コントローラを使用して Compose UI を操作すると、テキスト フィールドは他のフォーカス ターゲットとともにフォーカス ナビゲーションに参加します。

デフォルトでは、テキスト フィールドにフォーカスが固定されません。ユーザーがテキスト フィールドから移動できるようにするために、カスタム キーイベント ハンドラ(onKeyEvent または onPreviewKeyEvent)を追加する必要はありません。ユーザーは、Shift+Tab を使用するか、方向キーでテキストの境界を越えて移動することで、いつでも終了できます。

KeyboardOptions を使用して、ハードウェア キーボード ナビゲーションと連携する直感的なソフトウェア キーボード アクションを提供できます。たとえば、ImeAction.Next はフォーカスを次のフォーカス ターゲットに移動します。

1 次元のフォーカス走査

1 次元フォーカス走査では、Tab キーの動作は、テキスト フィールドに構成された lineLimits によって異なります。

  • 1 行のテキスト フィールド(TextFieldLineLimits.SingleLine) Tab キーを押すと、フォーカスが UI の次のフォーカス ターゲットに移動します。
  • 複数行のテキスト フィールド(TextFieldLineLimits.MultiLine() またはデフォルト): Tab キーを押すと、フォーカスが移動する代わりに、テキスト バッファにタブ文字(\t)が挿入されます。
  • 逆ナビゲーション(Shift+Tab): Shift+Tab キーを押すと、単一行と複数行のテキスト フィールドの両方で、フォーカスが前のフォーカス ターゲットに無条件で戻ります。

// Single-line text field: Tab advances focus to the next focus target
BasicTextField(
    state = singleLineState,
    lineLimits = TextFieldLineLimits.SingleLine,
    modifier = Modifier.fillMaxWidth()
)

// Multi-line text field: Tab inserts '\t'; Shift + Tab moves to previous target
BasicTextField(
    state = multiLineState,
    lineLimits = TextFieldLineLimits.MultiLine(),
    modifier = Modifier.fillMaxWidth()
)

2 次元フォーカス走査

矢印キー(または D-pad)を使用すると、まず方向キーでテキスト フィールド内のテキスト カーソル(キャレット)が移動します。

  • 縦方向のナビゲーション(上下): Down キーを押すと、カーソルが 1 行ずつ下に移動します。キャレットが最終行に達したときに、下キーをもう一度押すと、フォーカスがテキスト フィールドの下にある隣接するフォーカス ターゲットに移動します。最初の行で上キーを押すと、フォーカスが前のフォーカス ターゲットに移動します。
  • 水平ナビゲーション(左 / 右 / 開始 / 終了): 水平方向の矢印キーを押すと、カーソルが文字間を移動します。カレットがテキスト バッファの先頭または末尾に達したときに、方向キーをもう一度押すと、その方向の隣接するフォーカス ターゲットにフォーカスが移動します。

Android TV のテキスト フィールド

Android TV で、物理キーボードを使用せずに D-pad コントローラを使用する場合:

  1. テキスト フィールドにフォーカスを移動すると、画面上のソフトウェア キーボードが自動的に表示されます。
  2. ユーザーが D-pad を使用してソフトウェア キーボードのキーを操作します。
  3. [戻る] ボタンを押すと、テキスト フィールドのフォーカスを維持したまま、ソフトウェア キーボードが閉じます。
  4. ソフトウェア キーボードが閉じられると、D-pad の方向キーを押すと、画面上の隣接するフォーカス ターゲットにフォーカスが移動します。
  5. [戻る] ボタンを 2 回押すと、標準のシステムの戻るナビゲーションがトリガーされます。