返回Compat for AccessibilityTraversalOrder

时间:2017-01-12 17:30:05

标签: android accessibility android-support-library android-appcompat android-accessibility

我尝试以编程方式在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向后兼容性吗?

2 个答案:

答案 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声称它不起作用,但是我无法找到任何支持他的说法。