Java 如何从AccessibilityLegate';s AccessibilityNodeInfo?

Java 如何从AccessibilityLegate';s AccessibilityNodeInfo?,java,android,android-studio,accessibility,android-accessibility,Java,Android,Android Studio,Accessibility,Android Accessibility,我试图通过对讲说出主机视图中的文本内容,以及之后的“很酷” 为此,我在线性布局上设置了一个可访问性委托,但是info参数的text和contentDescription属性始终为空。i、 e.info.getText()和info.getContentDescription()始终返回null。我似乎无法从嵌套的TextView中提取文本 因此,host参数是一个线性布局,其中包含另一个嵌套的线性布局。该嵌套线性布局依次包含更多嵌套布局和文本视图作为其子级。(我的目标是API 21+) 编辑:在

我试图通过对讲说出
主机
视图中的文本内容,以及之后的“很酷”

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

因此,
host
参数是一个线性布局,其中包含另一个嵌套的线性布局。该嵌套线性布局依次包含更多嵌套布局和文本视图作为其子级。(我的目标是API 21+)

编辑:在检查
主机
参数时,所有预期的嵌套文本视图都存在,并带有各自的文本字段。问题是,我似乎无法从中提取文本


任何帮助都将不胜感激。

看来您必须反复检查孩子们

您可以使用
View::addChildrenForAccessibility(ArrayList 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());
super.onInitializeAccessibilityNodeInfo(主机,信息);
ArrayList childrenViews=新建ArrayList();
host.addChildrenForAccessibility(childrenview);
StringBuilder text=新的StringBuilder();
用于(视图:儿童视图){
如果(查看文本视图的实例){
append(((TextView)view.getText());
}                              
}
text.append(“太棒了”);
info.setContentDescription(text.toString());

看起来您必须迭代子对象

您可以使用
View::addChildrenForAccessibility(ArrayList 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());
super.onInitializeAccessibilityNodeInfo(主机,信息);
ArrayList childrenViews=新建ArrayList();
host.addChildrenForAccessibility(childrenview);
StringBuilder text=新的StringBuilder();
用于(视图:儿童视图){
如果(查看文本视图的实例){
append(((TextView)view.getText());
}                              
}
text.append(“太棒了”);
info.setContentDescription(text.toString());

如果在视图组上设置内容描述,将阻止对讲聚合来自子元素的文本。您需要手动聚合子文本,并使用它来填充内容描述。或者,您可以将0px文本视图添加为子视图,并指定要追加的文本。这两种方法都不是很可靠,因为可访问性API并不是针对这一点设计的。如果在视图组上设置内容描述,则会阻止TalkBack聚合来自子元素的文本。您需要手动聚合子文本,并使用它来填充内容描述。或者,您可以将0px文本视图添加为子视图,并指定要追加的文本。这两种方法都不是很可靠,因为这不是可访问性API设计的目的。