Доступность Android - невозможно объявить TextViews как заголовок или ссылку - PullRequest
4 голосов
/ 04 ноября 2019

У меня есть несколько TextView с, которые я хотел бы объявить в качестве заголовка или ссылки в режиме обратной связи. В настоящее время он просто объявляет текст внутри TextView, но я бы хотел, чтобы после него было написано «Заголовок» или «ссылка» в зависимости от TextView. Например, я бы хотел, чтобы в режиме Talkback было объявлено «Вход - заголовок», а не просто «Вход».

То, что я пробовал до сих пор, это добавить это в мои Activity onCreate():

ViewCompat.setAccessibilityDelegate(v, new AccessibilityDelegateCompat() {
        @Override
        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
            super.onInitializeAccessibilityNodeInfo(host, info);
            info.setHeading(true);
        }
    });

В режиме обратной связи никаких изменений нет - он по-прежнему просто объявляет "logв".

Я заметил, что этот метод, onInitializeAccessibilityNodeInfo, вызывается несколько раз. Когда я вхожу в отладчик, каждый раз, когда этот метод запускается, он показывает, что isHeading() имеет значение false, а затем устанавливается в true

Я использую этот метод неправильно? Почему это называется много раз? Почему info.setHeading(true) в основном игнорируется?

Как мне добиться чего-то подобного, но с режимом Talkback, объявляющим «Label - Link» вместо заголовка?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2019

Попробуйте это:

ViewCompat.setAccessibilityDelegate(v, new AccessibilityDelegateCompat() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        info.setRoleDesccription("heading");
    }
});
0 голосов
/ 15 ноября 2019

Я решил свою проблему!

Проблема в том, что само TextView не получает фокус. Вместо этого контейнерное представление, в данном случае FrameLayout, который оборачивает TextView, получало фокус. Вот почему установка самого 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.

...