Android のビューで AccessibilityTraversalOrder をプログラムで設定しようとしていますが、API レベル 22 でうまく機能しています。トラバーサル順序を設定するために呼び出すメソッドがあります。
@TargetApi(22)
public static void setAccessibilityAfter(View view, int afterId) {
view.setAccessibilityTraversalAfter(afterId);
}
そして、このように AccessibilityDelegate を設定します。
private static final AccessibilityDelegateCompat ACCESSIBILITY_DELEGATE_COMPAT =
new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(host, event);
event.setClassName(Button.class.getName());
}
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.setClassName(Button.class.getName());
}
};
最小 API バージョン 16 (JellyBean) をサポートする必要があるため、このソリューションは拡張できません。それで、 AccessibilityNodeInfoCompat クラスについて知りました。このようなヘルパーメソッドでこのようなクラスを使用しようとしました。
public static void setAccessibilityAfter(View view, int afterId) {
AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain(view);
ViewCompat.onInitializeAccessibilityNodeInfo(view, info);
if (afterId != View.NO_ID) {
View rootView = view.getRootView();
if (rootView == null) {
rootView = view;
}
View next = rootView.findViewById(afterId);
if (next != null) {
info.setTraversalAfter(next);
}
}
}
このソリューションには 2 つの問題があります。 1: ユーザーが画面上のそのビューに触れるとすぐにデリゲートが再度呼び出され、そのノードが再度初期化されるため、機能しません。そのため、ここで設定した traversalAfter 値が失われます。2: ここでもノードをリークしていますが、いつリサイクルするべきかわかりません。
NodeInfoCompat と AccessibilityDelegateCompat を使用して Android の下位互換性をフックする方法を教えてください。