4

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 の下位互換性をフックする方法を教えてください。

4

2 に答える 2

2

OPあなたの代替アプローチが何であったかはわかりませんが、これは私にとってはうまくいきました:

ViewCompat.setAccessibilityDelegate(mySecondView, new AccessibilityDelegateCompat() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(v, info);
        info.setTraversalAfter(myFirstView);
    }
});

ただし、@alanv が動作しないと主張している API 22 より前のバージョンではテストしていませんが、彼の主張を裏付けるものを見つけることができませんでした。

于 2017-02-14T00:46:55.633 に答える