web-dev-qa-db-ja.com

アクセシビリティフォーカスの順序を変更する

アクセシビリティフォーカスの順序を変更することは可能ですか?たとえば、IDがview1、view2、view3の3つのビューが並んでいる場合、ユーザーがview1から右にスワイプしたときにアクセシビリティフォーカスをview3に移動させる簡単な方法はありますか?

これが私が試したことです:

線形レイアウトで次のものがあります。

<ImageView
    Android:layout_width="30dp"
    Android:layout_height="30dp"
    Android:id="@+id/imageView"
    Android:focusable="true"
    Android:nextFocusUp="@+id/imageView3"
    Android:nextFocusDown="@+id/imageView3"
    Android:nextFocusRight="@+id/imageView3"
    Android:nextFocusLeft="@+id/imageView3"
    Android:nextFocusForward="@+id/imageView3"
    Android:src="@drawable/ic_launcher"/>

<ImageView
    Android:layout_width="30dp"
    Android:layout_height="30dp"
    Android:id="@+id/imageView2"
    Android:focusable="true"
    Android:src="@drawable/ic_launcher"/>

<ImageView
    Android:layout_width="30dp"
    Android:layout_height="30dp"
    Android:id="@+id/imageView3"
    Android:focusable="true"
    Android:nextFocusUp="@+id/imageView2"
    Android:nextFocusDown="@+id/imageView2"
    Android:nextFocusRight="@+id/imageView2"
    Android:nextFocusLeft="@+id/imageView2"
    Android:nextFocusForward="@+id/imageView2"
    Android:src="@drawable/ic_launcher"/>

次に、これを起動して、アクセシビリティフォーカスを最初のimageViewに配置します。右にスワイプして次のアイテムに移動すると、アクセシビリティフォーカスがimageView3に移動することを期待していますが、代わりにimageView2に移動します。

15
Allen Z.

MinSdkVersion> = 22のアプリケーションの場合、Android:accessibilityTraversalAfterを使用してXMLで直接スクリーンリーダーのトラバーサル順序を設定できます。

<ImageView
    Android:id="@+id/imageView"
    Android:layout_width="30dp"
    Android:layout_height="30dp"
    Android:src="@drawable/ic_launcher" />

<ImageView
    Android:id="@+id/imageView2"
    Android:layout_width="30dp"
    Android:accessibilityTraversalAfter="@id/imageView3"
    Android:layout_height="30dp"
    Android:src="@drawable/ic_launcher" />

<ImageView
    Android:id="@+id/imageView3"
    Android:layout_width="30dp"
    Android:layout_height="30dp"
    Android:src="@drawable/ic_launcher" />

より低いAPIレベルをサポートするアプリケーションの場合、トラバーサル順序はViewCompatを使用してプログラムで設定できます。

ViewCompat.setAccessibilityDelegate(imageView2, object : AccessibilityDelegateCompat() {
    override fun onInitializeAccessibilityNodeInfo(Host: View?, info: AccessibilityNodeInfoCompat?) {
        info?.setTraversalAfter(imageView3)
        super.onInitializeAccessibilityNodeInfo(Host, info)
    }
})

スクリーンリーダーのユーザーはナビゲーションの一貫性に依存しているため、フォーカスの順序を変更することはアンチパターンであり、避ける必要があることに注意してください。

19
Kio Krofovitch