我目前正在努力创建具有更多TalkBack
声音的PagerTabStrip
。
上下文是:
- 我想为
TalkBack
用户在左侧和右侧选项卡上添加“选项卡 [选项卡名称] 未选中,单击两次以选择”,并将“选项卡 [选项卡名称] 已选中”添加到中间选项卡。 - 我还想在单击选项卡时添加声音以警告用户其内容已更改并告诉
TalkBack
将焦点放在中心选项卡上。
我已经通过重写所有需要的类(例如:PagerTitleStrip
、ViewPager
、FragmentPagerAdapter
)并添加正确的部分成功地做到了这一点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/