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

时间:2016-09-12 17:47:02

标签: android accessibility talkback android-a11y

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

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

  

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

我想将此消息更改为

  

点击"操作1" ,双击并按住"操作2"

有办法吗?

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

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

4 个答案:

答案 0 :(得分:8)

在API 21+中,您可以通过在视图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 :(得分:5)

似乎AccessibilityAction稍有变化,因为 alanv 发布了他的回答。以下是使用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);
    }
});

答案 2 :(得分:1)

对于想要删除所有短语的人,请使用以下代码。 "双击"。

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();
                }
            }

答案 3 :(得分:1)

对于想删除所有短语的人,请使用以下代码。 “双击激活”,“长按两次并按住”。

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);
            }
        });