android - 向后兼容 AccessibilityTraversalOrder

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

我正在尝试以编程方式在 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/

相关文章:

java - 如何从 xml 获取字符串数组到 fragment 的 java 文件?

升级到 Xamarin Forms 2.0 后的 Android 资源问题

由于 `kapt`,Android 支持库 Bump 27.1.0 无法编译

android - java.lang.NoSuchFieldError : android. support.v7.appcompat

android - 应用程序 :theme now is deprecated

Android 切换按钮自定义外观

java - 如何计算到设定时间的剩余时间

android - Ignition RemoteImageView 给出 "Failed creating disk cache directory"警告

android - 我无法将支持库添加到我的 Android Studio 项目

android - Appcompat V7 - v21 抽屉导航不显示汉堡包图标