4

背景

片段创建它的视图,然后开始网络操作。网络操作完成后,根据网络操作的结果,创建各种类型的子视图并将其添加到片段的视图中。

问题

如果 aSpinner被片段添加,它的初始值由 TalkBack 宣布。这是非常不可取的,因为 Spinner 通常深埋在表单中。

失败的解决方案

我试过了:

  1. 包装 addView 与setImportantForAccessibility
  2. 不设置初始Spinner值(在任何情况下都不是可接受的解决方案)但添加时仍会宣布初始值
  3. Spinner's设置contentDescription为不间断空格,然后在onAttachedToWindow*中添加和恢复它

问题

Spinner在最初创建片段之后创建并动态添加。如何防止 TalkBack 宣布 的初始值Spinner

4

2 回答 2

3

这是我在我的项目中所做的一种解决方法,它按预期工作,即 Spinner 的内容只有在焦点对准时才会由 TalkBack 读出。

我将该类子AppCompatSpinner类化并覆盖其onInitializeAccessibilityEvent功能,如下所示:

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
        super.onInitializeAccessibilityEvent(event);
    }
}
于 2017-11-22T13:16:03.140 回答
0

1) 在 onCreate() 中为表单中的所有微调器设置重要的可访问性为 false。

spinner.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);

2) setOnHoverListener 到每个微调器并在其中再次启用可访问性并发送可访问性事件以正确宣布它们。

spinner.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
spinner.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
spinner.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
spinner.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); 

3) setOnTouchListener 到每个微调器以在双击后执行单击。

spinner.performClick();
于 2017-08-17T12:11:48.773 回答