如何从AccessibilityDelegate的AccessibilityNodeInfo中的视图中提取文本?

时间:2016-06-29 20:39:45

标签: java android android-studio accessibility android-accessibility

我正在尝试让TalkBack说出host视图中的文字内容,以及"很酷"然后。

为此,我在线性布局上设置了辅助功能委托,但info参数的text和contentDescription属性始终为null。即info.getText()info.getContentDescription()始终返回null。我似乎无法从嵌套的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参数时,所有预期的嵌套TextView都在那里,并带有各自的文本字段。问题是,我似乎无法从中提取文本。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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());