android - PagerTabStrip TalkBack 辅助功能

标签 android accessibility talkback

我目前正在努力创建具有更多TalkBack 声音的PagerTabStrip。 上下文是:

  • 我想为 TalkBack 用户在左侧和右侧选项卡上添加“选项卡 [选项卡名称] 未选中,单击两次以选择”,并将“选项卡 [选项卡名称] 已选中”添加到中间选项卡。
  • 我还想在单击选项卡时添加声音以警告用户其内容已更改并告诉 TalkBack 将焦点放在中心选项卡上。

我已经通过重写所有需要的类(例如:PagerTitleStripViewPagerFragmentPagerAdapter)并添加正确的部分成功地做到了这一点contentDescription 直接在选项卡 TextView 上。它工作得很好,但我不满意。这些类的维护需要为每个新版本的 Android 主类更新(或者我将保留旧设计),我发现每次复制粘贴所有类内容很脏(下一个开发人员呢?)。 所以,我尝试了另一种方法:

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

所以,我想知道是否可以使用子类来解决我的问题,或者我是否别无选择只能复制主类。 预先感谢您的帮助。

最佳答案

这其实很简单。您要做的是创建 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);
    }

}

请注意,我覆盖了内容描述。通过这种方式,我们不会更改应用程序的任何可视化表示,只是朗读出来的内容。

注意:对讲用户习惯于“双击选择”部分。正如我在我的代码中所做的那样,我会保留它。

关于android - PagerTabStrip TalkBack 辅助功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28472973/

相关文章:

Java:访问全局变量值时出现问题

css - 如果颜色可以访问,这些颜色之间的渐变是否可以访问?

java - 使用蓝牙键盘和语音助手的TextView按钮

java - 将值从数组转换为 findViewById id

Android SDK Ubuntu 默认路径

javascript - 如何重构 2 个相同的函数?

android - 如何将可访问性焦点转移到 RecyclerView 在某些操作上的第一个元素上?

安卓辅助功能 : characters announced twice

安卓 : Change theme background of Popup menu

css - ipad字体显示大,破坏布局,如何解决?