首页 文章

如何更改双击和长按的Android对讲说明

提问于
浏览
7

我有一个有长按动作处理程序的视图 . 我使用内容描述来设置消息,当视图获得焦点时,Talkback会说话 .

目前它在获得焦点后立即说出了我的内容描述,并在短暂停顿后说:

双击激活,双击并按住长按

我想将此消息更改为类似的内容

双击“动作1”,双击并按住“动作2”

有办法吗?

我查看 onPopulateAccessibilityEvent() ,它得到 TYPE_VIEW_ACCESSIBILITY_FOCUSED 事件,但我无法更改所需的消息 .

我错过了一些简单的事吗?

3 回答

  • 7

    在API 21中,您可以通过在View的 AccessibilityNodeInfo 上设置自定义操作来自定义操作名称 . 有两种方法:1)设置 AccessibilityDelegate 并覆盖 onInitializeAccessibilityNodeInfo 委托方法或2)扩展视图的类并覆盖 onInitializeAccessibilityNodeInfo .

    无论哪种方式,您将构建一个新的AccessibilityAction并使用AccessibilityNodeInfo.addAction在节点上设置它 .

    如果您选择使用委托,则应为单击操作设置自定义说明,如下所示:

    view.setAccessibilityDelegate(new AccessibilityDelegate() {
      @Override
      public void onInitializeAccessibilityNodeInfo(
          View v, AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(v, info);
    
        // A custom action description. For example, you could use "pause"
        // to have TalkBack speak "double-tap to pause."
        CharSequence description = getResources().getText(R.string.my_click_desc);
        AccessibilityAction customClick = new AccessibilityAction(
                AccessibilityAction.ACTION_ACTION_CLICK, description);
        info.addAction(customClick);
      }
    });
    

    如果您的应用程序目标API <21,请替换相应的 *Compat 支持库方法 . 该功能未向后移植,因此您无法获得API <21的自定义说明,但您可以避免在应用程序代码中进行显式版本检查 .

  • 1

    alanv 发布他的答案后,似乎 AccessibilityAction 略有变化 . 这是一个使用 ViewCompat 的工作解决方案:

    ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
        @Override
        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
            super.onInitializeAccessibilityNodeInfo(host, info);
            // A custom action description. For example, you could use "pause"
            // to have TalkBack speak "double-tap to pause."
            CharSequence description = host.getResources().getText(R.string.my_click_desc);
            AccessibilityActionCompat customClick = new AccessibilityActionCompat(
                        AccessibilityNodeInfoCompat.ACTION_CLICK, description);
            info.addAction(customClick);
        }
    });
    
  • 5

    对于那些想要删除所有短语的人,请使用以下代码 . “双击” .

    ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
            @Override
            public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
                super.onInitializeAccessibilityNodeInfo(host, info);
                info.addAction(AccessibilityNodeInfoCompat.ACTION_FOCUS);
            }
    });
    

    这基本上是调用以下代码而 requestFocus 没有与之关联的任何默认对讲通知 .

    case AccessibilityNodeInfo.ACTION_FOCUS: {
                    if (!hasFocus()) {
                        // Get out of touch mode since accessibility
                        // wants to move focus around.
                        getViewRootImpl().ensureTouchMode(false);
                        return requestFocus();
                    }
                }
    

相关问题