キーボード ナビゲーションをサポートする

ソフト入力方法(画面キーボードなど)に加えて、Android はデバイスに接続された物理キーボードもサポートしています。キーボードは、テキスト入力に便利なモードを提供するだけでなく、ユーザーが移動しアプリを操作する方法も提供します。スマートフォンなどのほとんどのハンドヘルド デバイスでは主な操作モードとしてタッチを使用しますが、タブレットや同様のデバイスの人気が高まっており、多くのユーザーがキーボード アクセサリの取り付けを望んでいます。

この種のエクスペリエンスを提供する Android デバイスが増えているため、キーボードでの操作をサポートするようにアプリを最適化することが重要です。このドキュメントでは、キーボードによる移動を改善する方法について説明します。

アプリをテストする

Android システムでは必要な動作のほとんどがデフォルトで有効になっているため、ユーザーはすでにキーボードを使用してアプリを移動できる可能性があります。

Android フレームワーク(ButtonEditText など)によって提供されるインタラクティブ ウィジェットはすべて、フォーカス可能です。つまり、ユーザーは D-pad またはキーボードなどのコントロール デバイスを使用して移動できます。各ウィジェットは入力フォーカスを得ると点灯するか、外観が変わります。

アプリをテストする手順は次のとおりです。

  1. ハードウェア キーボードを利用できるデバイスにアプリをインストールします。

    キーボード付きのハードウェア デバイスがない場合は、Bluetooth キーボードまたは USB キーボードを接続します。

    Android Emulator も使用できます。

    1. AVD Manager で、[New Device] をクリックするか、既存のプロファイルを選択して [Clone] をクリックします。
    2. 表示されるウィンドウで、[Keyboard] と [DPad] が有効になっていることを確認します。
  2. アプリをテストするには、Tab キーのみを使用して UI を移動します。各 UI コントロールが期待どおりにフォーカスされることを確認します。

    予期しない方法でフォーカスが移動するインスタンスを探します。

  3. アプリの先頭からやり直し、キーボードの矢印キーなどの方向コントロールを使用して UI を操作します。UI のフォーカス可能な各要素から、を押します。

    予期しない方法でフォーカスが移動するインスタンスを探します。

Tab キーまたは方向コントロールで移動しても期待どおりに動作しない場合は、次のセクションで説明するように、レイアウト内でのフォーカスの移動先を指定します。

タブ ナビゲーションの処理

ユーザーがキーボードの Tab キーを使用してアプリを移動すると、システムは、要素がレイアウトに表示される順序に基づいて要素間で入力フォーカスを渡します。たとえば相対レイアウトを使用し、画面上の要素の順序がファイル内の順序と異なる場合、フォーカスの順序を手動で指定する必要があります。

たとえば次のレイアウトでは、2 つのボタンが右側に配置され、テキスト フィールドが 2 番目のボタンの左側に配置されています。最初のボタンからテキスト フィールド、次に 2 番目のボタンにフォーカスを渡すために、レイアウトでは android:nextFocusForward 属性を使用して、フォーカス可能な要素ごとにフォーカス順序を明示的に定義する必要があります。

<androidx.constraintlayout.widget.ConstraintLayout ...>
    <Button
        android:id="@+id/button1"
        android:nextFocusForward="@+id/editText1"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        ... />
    <Button
        android:id="@+id/button2"
        android:nextFocusForward="@+id/button1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/button1"
        ... />
    <EditText
        android:id="@id/editText1"
        android:nextFocusForward="@+id/button2"
        app:layout_constraintBottom_toBottomOf="@+id/button2"
        app:layout_constraintRight_toLeftOf="@id/button2
        ...  />
    ...
</androidx.constraintlayout.widget.ConstraintLayout>

これで、フォーカスが button1 から button2editText1 の順に移動するのではなく、画面上の外観に応じて button1 から editText1button2 の順に適切に移動します。

方向ナビゲーションの処理

ユーザーは、キーボードの矢印キーを使用してアプリを移動することもできます。これは、D-pad またはトラックボールで移動するときと同じ動作です。システムは、画面上のビューのレイアウトに基づいて、所定の方向でどのビューにフォーカスを合わせるべきかについて最良の推測を行います。ただし、システムが間違った推測をすることもあります。

所定の方向に移動するときにシステムが適切なビューにフォーカスを渡さない場合は、次の属性を使用して、フォーカスを受け取るビューを指定します。

各属性は、ビュー ID で指定された方向にユーザーが移動したときにフォーカスを受け取る次のビューを指定します。次の例に示します。

<Button
    android:id="@+id/button1"
    android:nextFocusRight="@+id/button2"
    android:nextFocusDown="@+id/editText1"
    ... />
<Button
    android:id="@id/button2"
    android:nextFocusLeft="@id/button1"
    android:nextFocusDown="@id/editText1"
    ... />
<EditText
    android:id="@id/editText1"
    android:nextFocusUp="@id/button1"
    ...  />

参考情報

以下の関連リソースもご覧ください。