Как извлечь текст из представлений в 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());