android - Android 辅助功能 - 无法将 TextViews 宣布为标题或链接
问题描述
我有一些TextView
s 想在 Talkback 模式下作为标题或链接宣布。TextView
目前,它只是宣布TextView
. 例如,我希望对讲模式宣布“登录 - 标题”,而不仅仅是“登录”。
到目前为止,我尝试的是在我Activity
的 's中添加这个onCreate()
:
ViewCompat.setAccessibilityDelegate(v, new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.setHeading(true);
}
});
在对讲模式下,没有任何变化——它仍然只是宣布“登录”。
我注意到的是,这个方法onInitializeAccessibilityNodeInfo
被多次调用。当我在调试器中单步执行时,每次触发此方法时,它都会显示isHeading()
为 false,然后设置为 true。
我是否错误地使用了这种方法?为什么会被多次调用?为什么info.setHeading(true)
基本被忽略?
我将如何完成类似的事情,但对讲模式宣布“标签 - 链接”而不是标题?
解决方案
我已经解决了我的问题!
问题是 TextView 本身没有获得焦点。相反,容器视图(在本例中为包装 TextView 的 FrameLayout)正在获得焦点。这就是为什么将 TextView 本身设置为标题似乎不起作用的原因 - 它周围的视图正在获得焦点。
所以给定xml布局:
<FrameLayout
android:id="@+id/fl_login_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="true" >
...
<TextView
android:id="@+id/tv_login_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/login_sign_in_to_your_account" />
</FrameLayout>
有两种解决方案:
API 28+:
<FrameLayout
...
android:accessibilityHeading="true" >
或者,在代码中,您可以执行与我原来的问题相同的操作:
ViewCompat.setAccessibilityDelegate(v, new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.setHeading(true);
}
});
但是你传递容器视图而不是 TextView。
推荐阅读
- django - 如何根据传入的请求提供不同的序列化程序
- javascript - 在 Web 应用程序中,将日期格式化为 Chrome 上的区域设置不起作用
- class - 如何仅使用 Easymock 模拟泛型?
- reactjs - ReactJS 变异道具
- python - 散景图未显示
- angular - 功能先于读取图像数据执行
- javascript - React-native-vector-icons 显示晦涩的符号
- datatables - 活动记录数据表中的静态过滤选项
- java - LinkedList.iterator() 返回什么对象?
- ruby-on-rails - Rails:未初始化的常量 - 无法从控制器访问另一个类