首页 > 解决方案 > Android 辅助功能 - 无法将 TextViews 宣布为标题或链接

问题描述

我有一些TextViews 想在 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)基本被忽略?

我将如何完成类似的事情,但对讲模式宣布“标签 - 链接”而不是标题?

标签: androidtalkbackandroid-accessibility

解决方案


我已经解决了我的问题!

问题是 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。


推荐阅读