16

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

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

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

我想将此消息更改为类似

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

有没有办法这样做?

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

我错过了一些简单的东西吗?

4

5 回答 5

18

自从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);
    }
});
于 2017-09-21T23:11:09.013 回答
11

在 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_CLICK, description);
    info.addAction(customClick);
  }
});

如果您的应用程序以 API < 21 为目标,请替换适当的*Compat支持库方法。该功能未向后移植,因此您不会在 API < 21 上获得自定义描述,但您将能够避免在应用程序代码中进行显式版本检查。

于 2016-09-14T00:53:52.913 回答
7

对于那些想要删除所有短语的人,请使用下面的代码,即。“双击激活”,“双击并按住长按”。

mSubTitleText = (TextView) view.findViewById(R.id.txt_subtitle);

 ViewCompat.setAccessibilityDelegate(mSubTitleText, new AccessibilityDelegateCompat() {
            @Override
            public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
                host.setClickable(false);
                host.setLongClickable(false);
            }
        });
于 2019-02-04T07:27:01.033 回答
0

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

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();
                }
            }
于 2017-12-18T20:09:25.823 回答
0

这是一个示例:

ViewCompat.setAccessibilityDelegate(set_actions_button, object : AccessibilityDelegateCompat() {
    override fun onInitializeAccessibilityNodeInfo(v: View, info: AccessibilityNodeInfoCompat) {
        super.onInitializeAccessibilityNodeInfo(v, info)
        info.addAction(AccessibilityActionCompat(
            AccessibilityNodeInfoCompat.ACTION_CLICK, "Edit note"))
        info.addAction(AccessibilityActionCompat(
            AccessibilityNodeInfoCompat.ACTION_LONG_CLICK, "Copy note"))
    }
})

看看这篇解释得很好的文章。

于 2021-09-06T10:45:04.543 回答