我现在正努力用更多的发声来创造PagerTabStrip
上下文是:
我想把“tab[tab name]not selected,click two to select”on left and right tabs and“tab[tab name]selected”添加到TalkBack用户的中间一个。
我还想在单击某个选项卡时添加一个发声功能,以警告用户其内容已更改,并告诉TalkBack聚焦中心选项卡。
我已经通过重写所有需要的类(例如:TalkBackPagerTitleStripViewPager)并直接在选项卡上添加右边的FragmentPagerAdapter部分完成了这项工作。它工作得很好,但我不满意。这些类的维护需要针对android主类的每个新版本进行更新(或者我将保留旧的设计),我发现每次复制粘贴所有的类内容都很麻烦(下一个开发人员呢?).
所以,我尝试了另一种方法:
contentDescription的子类中使用TextView为发声提供更多上下文。它不起作用,因为AccessibilityEvent中的PagerTabStripgetText()方法不用于发声。
getContentDescription开始做AccessibilityEvent看看我能不能解决它。但我还没有确定发声的来源(是标签还是内容),也没有确定在AccessibilityNodeInfo中必须更改什么才能更改发声。
所以,我想知道是否可以使用子类来解决我的问题,或者我除了复制主类之外别无选择。
提前谢谢你的帮助。

最佳答案

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

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读取的内容。
注:对讲用户使用“双击选择”部分。就像我在代码中所做的那样,我会把它关掉。

08-04 04:34