繁体   English   中英

PagerTabStrip TalkBack可访问性

[英]PagerTabStrip TalkBack accessibility

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

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

通过重写所有需要的类(例如: PagerTitleStripViewPagerFragmentPagerAdapter )并直接在TextView选项卡上添加正确的contentDescription ,我已经成功地部分地完成了它。 它工作得很好,但我不满意。 这些类的维护需要针对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);
    }

}

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

注意:对讲用户可以使用“双击选择”部分。 我会在我的代码中完成此操作。

对于选项卡本身,如果您负责对视图进行充气,则可以使用自定义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.tab_selected<string name="tab_selected">%1$s selected</string>

这预先假定您(或您正在使用的库 setActivated(true)/setSelected(true)在选中时使用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视图上。

您可以通过覆盖onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info)方法来修改TalkBack使用辅助功能委托大声朗读的操作:

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将会读取: "<tab content description>... double tap to select tab"

本答案中给出了自定义使用提示的其他方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM