我目前正在努力创建PagerTabStrip
更多TalkBack
发声。
背景是:
TalkBack
用户的中心位置。TalkBack
关注中心标签。通过重写所有需要的类(例如:PagerTitleStrip
,ViewPager
,FragmentPagerAdapter
)并直接在选项卡上添加右contentDescription
,我已经成功完成了部分操作TextView
。它工作得很好,但我不满意。这些类的维护需要针对Android主类的每个新版本进行更新(或者我将保留旧设计)并且我发现每次都要粘贴所有类内容的脏(以及下一个开发人员呢?)。
所以,我尝试了另一个方法:
AccessibilityEvent
的子类中使用PagerTabStrip
为发声提供更多背景信息。它不起作用,因为getText()
中的getContentDescription
和AccessibilityEvent
方法不用于发声。 AccessibilityNodeInfo
开始ViewPager
工作,看看能不能解决问题。但是我没有确定发声的来源(是标签还是内容),也没有确定AccessiblityNodeInfo
中必须改变的内容才能改变发声。所以,我想知道是否有可能使用子类来解决我的问题,或者我除了复制主类之外别无选择。 在此先感谢您的帮助。
答案 0 :(得分:1)
这实际上非常简单。你想要做的是创建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);
}
}
请注意,我覆盖了内容说明。通过这种方式,我们不会更改应用程序的任何可视化表示,只是回读的内容。
注意:对讲用户可以使用“双击选择”部分。我会把它关掉,就像我在我的代码中所做的那样。
答案 1 :(得分:0)
对于选项卡本身,如果您负责给View充气,那么您可以使用自定义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>
这预先假定您(或the library you're using)在选中时使用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"
。
this answer中提供了自定义使用提示的其他方法。