Как извлечь текст из представлений в AccessibilityDelegate в AccessibilityNodeInfo?

Я пытаюсь заставить TalkBack сказать, что в тексте, который находится внутри host Посмотреть вместе с "это круто" потом.

Для этого я устанавливаю делегата специальных возможностей на линейном макете, но info Свойства параметра text и contentDescription всегда равны нулю. т.е. info.getText() а также info.getContentDescription() всегда возвращают ноль. Я не могу извлечь текст из вложенных TextViews.

host Таким образом, параметр представляет собой линейный макет, который содержит еще один вложенный линейный макет внутри него. Этот вложенный линейный макет, в свою очередь, содержит больше вложенных макетов и текстовых представлений, чем их дочерние элементы. (Я нацеливаюсь на API 21+)

linearLayout.setAccessibilityDelegate(new View.AccessibilityDelegate()
{
    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info)
    {
        super.onInitializeAccessibilityNodeInfo(host, info);

        String newWordsToSay = info.getText() + " is cool"
        //info.getText() CRASHES due to null pointer exception
        info.setContentDescription(info.setText(newWordsToSay));
    }
});

РЕДАКТИРОВАТЬ: при проверке host param, все ожидаемые вложенные TextViews с соответствующими текстовыми полями. Проблема в том, что я не могу извлечь из них текст.

Любая помощь будет оценена.

1 ответ

Решение

Похоже, вы должны перебирать детей.

Вы можете собрать детей, имеющих отношение к доступности, используя View::addChildrenForAccessibility(ArrayList<View> list) метод, он заполняет пройденный list, Затем вы можете объединить их тексты:

super.onInitializeAccessibilityNodeInfo(host, info);

ArrayList<View> childrenViews = new ArrayList<>();
host.addChildrenForAccessibility(childrenViews);

StringBuilder text = new StringBuilder();
for (View view : childrenViews) {
  if (view instanceof TextView) {
    text.append(((TextView)view).getText());
  }                              
}

text.append(" is awesome");
info.setContentDescription(text.toString());
Другие вопросы по тегам