我尝试以编程方式在Android视图中设置AccessAtraibilityTraversalOrder,它在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());
}
};
我需要支持16的最小API版本(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);
}
}
}
此解决方案存在两个问题: 1:它不起作用,因为只要用户在屏幕上触摸该视图,代理就会再次被调用并再次初始化该节点,因此我丢失了我在此处设置的遍历值。 2:我也在这里漏了一个节点,我不知道什么时候回收。
有人可以帮助我如何使用NodeInfoCompat和AccessibilityDelegateCompat来挂钩Android向后兼容性吗?
答案 0 :(得分:1)
调用AccessibilityNodeInfoCompat.setTraversalBefore/After
对API< 22.该功能未向后移植。
通过简单地在Build.VERSION.SDK_INT >= 22
上打电话,您将获得相同的效果:
public static void setAccessibilityTraversalAfter(View view, int afterId) {
if (Build.VERSION.SDK_INT >= 22) {
view.setAccessibilityTraversalAfter(afterId);
}
}
答案 1 :(得分:1)
OP我不知道你的替代方法是什么,但这对我有用:
ViewCompat.setAccessibilityDelegate(mySecondView, new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(v, info);
info.setTraversalAfter(myFirstView);
}
});
然而,我没有在API 22之前的任何测试中进行测试,但是@alanv声称它不起作用,但是我无法找到任何支持他的说法。