我现在正努力用更多的发声来创造PagerTabStrip
。
上下文是:
我想把“tab[tab name]not selected,click two to select”on left and right tabs and“tab[tab name]selected”添加到TalkBack
用户的中间一个。
我还想在单击某个选项卡时添加一个发声功能,以警告用户其内容已更改,并告诉TalkBack
聚焦中心选项卡。
我已经通过重写所有需要的类(例如:TalkBack
,PagerTitleStrip
,ViewPager
)并直接在选项卡上添加右边的FragmentPagerAdapter
部分完成了这项工作。它工作得很好,但我不满意。这些类的维护需要针对android主类的每个新版本进行更新(或者我将保留旧的设计),我发现每次复制粘贴所有的类内容都很麻烦(下一个开发人员呢?).
所以,我尝试了另一种方法:
在contentDescription
的子类中使用TextView
为发声提供更多上下文。它不起作用,因为AccessibilityEvent
中的PagerTabStrip
和getText()
方法不用于发声。
从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读取的内容。
注:对讲用户使用“双击选择”部分。就像我在代码中所做的那样,我会把它关掉。