初始化时如何防止微调器公告

How to prevent Spinner announcement when initialized

背景

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

问题

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

失败的解决方案

我试过:

  1. setImportantForAccessibility
  2. 包装 addView
  3. 未设置初始 Spinner 值(在任何情况下都不是可接受的解决方案)但添加时仍会公布初始值
  4. onAttachedToWindow *
  5. 中添加和恢复之前,将 SpinnercontentDescription 设置为不间断 space

问题

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

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) 为每个微调器设置 OnTouchListener 以在双击后执行点击。

spinner.performClick();

这是我在我的项目中所做的一个解决方法,它按预期工作,即 Spinner 的内容仅在它处于焦点时由 TalkBack 读出。

我子class编辑了 AppCompatSpinner class 并覆盖了它的 onInitializeAccessibilityEvent 函数,如下所示:

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
        super.onInitializeAccessibilityEvent(event);
    }
}