我正在尝试以编程方式在 Android 中的 View 上设置 setAccessibilityTraversalOrder,它在 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);
}
}
}
这个解决方案有两个问题: 1:它不起作用,因为一旦用户触摸屏幕上的那个 View ,委托(delegate)就会再次被调用并再次初始化该节点,所以我失去了我在这里设置的 traversalAfter 值。 2:我这里也泄露了一个节点,不知道什么时候回收。
任何人都可以帮助我如何使用 NodeInfoCompat 和 AccessibilityDelegateCompat Hook Android 向后兼容性?
最佳答案
OP 我不知道您的替代方法是什么,但这对我有用:
ViewCompat.setAccessibilityDelegate(mySecondView, new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(v, info);
info.setTraversalAfter(myFirstView);
}
});
但是我没有在早于 API 22 的任何东西上测试它,@alanv 声称它不起作用,但我找不到任何东西来支持他的说法。
关于android - 向后兼容 AccessibilityTraversalOrder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41619460/