キーボード ナビゲーションのサポート

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

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

注: アプリケーションで方向ナビゲーションをサポートすることも、ビジュアル キューを使用して移動しないユーザーがアプリケーションにアクセスできるようにするために重要です。アプリケーションで方向ナビゲーションを完全にサポートすることで、uiautomator などのツールを使用してユーザー インターフェースのテストを自動化することもできます。

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

アプリのテスト

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

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

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

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

    キーボード付きのハードウェア デバイスがない場合は、Bluetooth キーボードまたは USB キーボードを接続します(ただし、すべてのデバイスが USB アクセサリをサポートしているわけではありません)。

    Android Emulator も使用できます。

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

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

  3. アプリの先頭から開始し、代わりに方向コントロール(キーボードの矢印キー)を使用してアプリを移動します。

    UI のフォーカス可能な各要素から、上、下、左、右を押します。

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

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

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

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

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

    <RelativeLayout ...>
        <Button
            android:id="@+id/button1"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:nextFocusForward="@+id/editText1"
            ... />
        <Button
            android:id="@+id/button2"
            android:layout_below="@id/button1"
            android:nextFocusForward="@+id/button1"
            ... />
        <EditText
            android:id="@id/editText1"
            android:layout_alignBottom="@+id/button2"
            android:layout_toLeftOf="@id/button2"
            android:nextFocusForward="@+id/button2"
            ...  />
        ...
    </RelativeLayout>
    

これで 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"
        ...  />