22

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

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

私は線形レイアウトで以下を持っています。

<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 に移動します。

4

2 に答える 2

37

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)
    }
})

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

于 2015-06-02T08:49:51.860 に答える