如何在片段的视图中激活对讲?

How to activate Talkback inside of an fragment's views?

我目前正在将辅助功能作为一项新功能添加到我的应用程序中。 我的目标是用户将使用 Android 集成的 TalkBack 服务来导航它。

一切正常,因为我在 activity 布局内的元素上设置了 内容描述,即

        <View
          style="@style/custom.style"
          android:contentDescription="@string/my_string_value"/>

这样,每次显示我的 activity 时,TalkBack 都会读取内容描述值。

我只使用一个 activity 并没有取得同样的成功,它在上面推送了几个片段。因此,如果我尝试在片段布局内的任何元素上设置 content description ,则不会(自动)读取它,直到它检测到触摸事件(我期待 TalkBack它会自动生成,就像 activity 布局中的视图一样)

为了得到我期望的结果,我把这个放在片段中 class:

public abstract class myFragment extends Fragment  {
...
  @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) {
       ...
       myCustomView = (LinearLayout) rootView.findViewById(R.id.duende);
       myCustomView.requestFocus();
  }
}

到目前为止,这还没有成功,将可访问性设置为 内容的同样的事情发生了变化

getWindow().getDecorView().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);

有没有人遇到过类似的问题?

首先,重要的是要注意 Fragment 的功能与正常活动中的布局没有区别。片段只是构建代码的一种便捷方式。如果您将应用程序编码为一系列片段,或者单个 activity 中的一堆布局,Android/the 辅助功能 API 看到的内容是相同的。话虽如此,我相信您正在寻找的是以下内容:

您需要做的是移动辅助功能焦点。

myCustomView.requestFocus();

正在移动我认为的输入焦点。这对 TalkBack 没有影响,实际上几乎完全没有意义,除非您使用键盘导航,或者我们正在谈论 EditText 框。您要做的是移动 Accessibility/TalkBack 焦点。这可以通过以下代码行来完成:

myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

注意:请牢记 WCag 2.0 标准,尤其是在自动将焦点转移到 TalkBack 用户身上时。这对于视力不佳的用户来说可能会变得非常混乱!

不确定您是否仍在寻找解决方案,但对于未来的寻求者:) -

很多时候,焦点请求只在 post/postdelay 函数中调用一次。

示例 -

myCustomView.postDelayed(new Runnable() {
            @Override
            public void run() {
                myCustomView.setFocusable(true);
                myCustomView.requestFocus();
                myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
            }
        },1000);

在处理片段时,我喜欢同时调用焦点、输入焦点(就像上一个答案中的那个人所说的那样)和可访问性焦点,因为在片段上实现可访问性时,您可能会遇到一些恼人的问题。因此这总是为我做的工作。