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

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 から button2 に、そして editText1 に移動するのではなく、画面の表示に応じて button1 から editText1、次に button2 に移動するようになりました。

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

ユーザーはキーボードの矢印キーを使用してアプリを操作することもできます。この操作は、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"
    ...  />

参考情報

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