当前位置: 首页 > 知识库问答 >
问题:

PagerTab地带对讲可访问性

云骏奇
2023-03-14

我目前正努力用更多的TalkBack发声来创建PagerTabStrip。背景是:

  • 我想为对讲用户在左右选项卡上添加“未选择选项卡[选项卡名称],单击两次以选择”和“已选择选项卡[选项卡名称]”到中间位置
  • 我还想在单击选项卡时添加一个发声,以警告用户其内容已更改,并告诉TalkBack聚焦中心选项卡

通过重写所有需要的类(例如:PagerTitleStripViewPagerFragmentPagerAdapter),并直接在选项卡TextView添加右侧的contentDescription,我已经部分成功地完成了这项工作。它运行得相当好,但我不满意。这些类的维护需要针对Android主类的每个新版本进行更新(或者我将保留旧的设计),并且我发现每次复制粘贴所有类内容都是肮脏的(下一个开发人员呢?)。因此,我尝试了另一种方法:

  • PagerTabStrip的子类中使用AccessibilityEvent,为发声提供更多上下文。它不起作用,因为AccessibilityEvent中的getText()getContentDescription方法不用于发声
  • ViewPager查看AccessibilityNodeInfo,看看我是否能解决这个问题。但是我还没有确定发声的来源(是标签还是内容),也没有确定必须在AccessiblityNodeInfo中更改什么才能更改发声

因此,我想知道是否可以使用子类来解决我的问题,或者我除了复制主类之外是否别无选择。提前感谢你的帮助。

共有2个答案

郑星雨
2023-03-14

对于选项卡本身,如果您负责膨胀视图,那么您可以使用自定义TextView,根据其激活(或选择)状态修改其内容描述:

public class TabTextView extends TextView {

    public TabTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public CharSequence getContentDescription() {
        CharSequence contentDescription = super.getContentDescription();
        return isActivated() ? appendSelectedTo(contentDescription) : contentDescription;
    }

    private String appendSelectedTo(CharSequence contentDescription) {
        return getResources().getString(R.string.tab_selected, contentDescription);
    }
}

其中R.string。所选选项卡\u

这预先假定您(或您正在使用的库)在选中时正在使用setActivated(true)/setSelected(true)标记选项卡视图(以及使用setActivated(false)/setSelected(false))。

向用户宣布内容已更改的最简单方法是添加ViewPager。通知页面更改时的OnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
        // TODO: format correctly with String resource to support translation
        viewPager.announceForAccessibility("Showing " + viewPager.getAdapter().getPageTitle(position));
    }

});

我知道Android TalkBack用户已经习惯了这种行为,而不知道什么是可点击的

@ChrisCM提到的元素上有一个(默认情况下)可单击的指示-TalkBack将在带有View的视图中追加“双击激活”(以前是“双击选择”)。附加OnClickListener

您可以修改TalkBack使用可访问性委托大声读取的操作,方法是重写onOrializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info)方法:

class TabAccessibilityDelegate extends AccessibilityDelegateCompat {

    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        info.addAction(
                new AccessibilityNodeInfoCompat.AccessibilityActionCompat(
                        AccessibilityNodeInfoCompat.ACTION_CLICK,
                        "select tab"
                )
        );
    }

}

并在每个选项卡视图上设置它:

ViewCompat.setAccessibilityDelegate(tabView, new TabAccessibilityDelegate());

这样,现在TalkBack将读取:"

此答案中给出了定制使用提示的其他方法。

孙阳旭
2023-03-14

这其实很简单。您要做的是创建PagerTabStrip的子类。在这个子类中,增加可访问性事件的传播以添加所需的信息!下面是我的实现。

public class A11yPagerTabStrip extends PagerTabStrip {

    public A11yPagerTabStrip(Context context) {
        super(context);
    }

    public A11yPagerTabStrip(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
        Log.wtf(LOG_TAG, "onRequestSendAccessibilityEvent: " + event.toString());

        final String textViewTitle = ((TextView) child).getText().toString();
        final ViewPager viewPager = (ViewPager) this.getParent();
        final int itemIndex = viewPager.getCurrentItem();

        String title = viewPager.getAdapter().getPageTitle(itemIndex).toString();

        if (textViewTitle.equalsIgnoreCase(title)) {
            child.setContentDescription("Tab " + textViewTitle + "selected.");
        } else {
            child.setContentDescription("Tab " + textViewTitle + "not selected.");
        }

        return super.onRequestSendAccessibilityEvent(child, event);
    }

}

请注意,我覆盖了内容描述。通过这种方式,我们不改变应用程序的任何可视化表示,只改变talk back读取的内容。

注:对讲用户使用“双击选择”部分。正如我在代码中所做的那样,我将停止此操作。

 类似资料:
  • 我有这个应用程序与WebView显示HTML内容。 在我做了一些相当大的更改之后,对讲的可访问性出现了一些“问题”,特别是文本到语音和触摸探索,仅在4.4设备上(不在5.0上)。 触摸一段(段落)文本有时会起作用,但有时会产生点击声,没有输出,文本也不会像应该的那样用选择矩形突出显示。 在5.0上,一切都很好:触摸一段文本会在其周围绘制一个选择,文本就会被说出。 我知道4.4上的回归与我的一些更改

  • Apple许可地狱:osascript和可访问性(辅助访问)。 错误:不允许osascript进行辅助访问。(-1719) 我在一个名为QuickenUpdate的文件中有一行脚本。scpt 在脚本编辑器中运行(works): 运行在终端(工程): 我有一个shell脚本(QU.sh)来运行这个。 如果我从BBEdit内部运行QU.sh,它会起作用。 如果我运行QU. sh从终端,它的工作原理。

  • 在某些用户操作中,我想在屏幕上发布一些<code>声明,不久之后,我想将可访问性焦点转移到<code>特定视图。 我可以实现它就像, 但这只是一种变通方法。当用户使用< code >自定义语速时,在某些情况下可能会失败。 当对讲机在阅读公告后结束时,我们有没有办法得到回拨?

  • 启用对讲后,是否有办法将辅助功能焦点手册设置为特定视图?例如,当我的活动开始时,我希望TalkBack自动聚焦于某个按钮(视图周围的黄色框)并读取其内容描述。 到目前为止,我所尝试的: 请求焦点()似乎只是请求输入焦点,与可访问性焦点无关。我也尝试过: 这些似乎都不起作用。

  • 我已经为我的应用程序编写了自己的。在内部,它使用为通过我的应用导航的用户提供语音反馈。当打开和时,我从我的应用程序中获得口头反馈,然后是TalkBack的反馈。 有什么方法可以停止TalkBack为我的应用程序,因为我拥有我的应用程序的可访问性服务?

  • 当视图具有事件单击并启用对讲时。我需要禁用视图中的“双击”音频。 我在android开发中使用可访问性。 请问我该怎么做?