0

我试图让 TalkBack 说出host视图内的文本中的内容,以及之后的“很酷”。

为此,我在线性布局上设置了可访问性委托,但info参数的 text 和 contentDescription 属性始终为空。即info.getText()并且info.getContentDescription()总是返回null。我似乎无法从嵌套的 TextView 中提取文本。

因此,该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 都在那里,以及它们各自的文本字段。问题是,我似乎无法从中提取文本。

任何帮助,将不胜感激。

4

1 回答 1

2

看起来你必须遍历孩子。

您可以使用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());
于 2016-06-30T18:54:59.383 回答