Android 可访问性-分级栏自动聚焦

Android 可访问性-分级栏自动聚焦,android,android-accessibility,Android,Android Accessibility,用例:可访问性-自动聚焦分级栏:在屏幕呈现或视图值更新后立即开始说出内容描述。我不希望它自动聚焦并开始说话。当用户聚焦时,它应该说话 我的版面中有分级栏,一旦版面在屏幕上呈现,它就会自动对焦 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > ... <androidx.appcompat.widget.AppCompatRatin

用例:可访问性-自动聚焦分级栏:在屏幕呈现或视图值更新后立即开始说出内容描述。我不希望它自动聚焦并开始说话。当用户聚焦时,它应该说话

我的版面中有分级栏,一旦版面在屏幕上呈现,它就会自动对焦

 <FrameLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >
 ...
    <androidx.appcompat.widget.AppCompatRatingBar
      ...
     android:id="@+id/rating_bar"
     android:contentDescription="@{@string/no_of_reviews_displayed_ada(rating)}"
     android:rating="@{rating}"
     />
 ...
 </FrameLayout>
一旦设置了布局渲染和分级,可访问性就开始说出分级,而无需手动聚焦

我尝试的是:

  • 默认情况下,向其他元素请求焦点。但不知何故,在
    设置上
    appcompatingbar
    获取焦点。对我来说,它们似乎是从ProgressBar继承的,ProgressBar是基于输入的视图
  • 默认情况下,将
    importantForAccessibility
    设置为
    no
    ,并在获取observable上的值后更改。虽然这看起来很棘手,因为它需要一些持续时间间隔才能工作
是否有任何可访问性侦听器可以挂接到这个分级栏,并在它获得实际焦点并发送可访问性事件时进行侦听

通过检查,我发现:

@Override
public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfoInternal(info);

    if (canUserSetProgress()) {
        info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_PROGRESS);
    }
}

@Override
boolean canUserSetProgress() {
    return super.canUserSetProgress() && !isIndicator();
}
因此,您的代码可以通过将代码更改为:

vm.getRatingsData().observe(this, rating -> {
  rating_bar.setIsIndicator(true)
  binding.setRating(rating);
  rating_bar.setIsIndicator(false)
});
否则,如果用户不必更改评级值,则可以直接从xml中设置isIndicator值。

通过检查,我发现:

@Override
public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfoInternal(info);

    if (canUserSetProgress()) {
        info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_PROGRESS);
    }
}

@Override
boolean canUserSetProgress() {
    return super.canUserSetProgress() && !isIndicator();
}
因此,您的代码可以通过将代码更改为:

vm.getRatingsData().observe(this, rating -> {
  rating_bar.setIsIndicator(true)
  binding.setRating(rating);
  rating_bar.setIsIndicator(false)
});

否则,如果用户不必更改评级值,则可以直接从xml设置isIndicator值。

您确定GTalk设置没有问题吗。我的意思是我们在布局和辅助功能服务中有
分级栏
。只有当用户触摸它时,它才会宣布评级。或者当GTalk配置为读取整个页面时。您确定GTalk设置没有问题吗。我的意思是我们在布局和辅助功能服务中有
分级栏
。只有当用户触摸它时,它才会宣布评级。或者当GTalk配置为读取整个页面时。