2

我目前正在将可访问性添加为我的应用程序中的一项新功能。我的目标是用户将使用Android 集成的TalkBack服务对其进行导航。

一切都运行良好,因为我正在我的活动布局内的元素上设置内容描述,即

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

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

仅使用一项在其上推送多个片段的活动,我并没有取得同样的成功。因此,如果我尝试在片段布局内的任何元素上设置内容描述,则在检测到触摸事件之前不会(自动)读取它(我希望 TalkBack 会自动执行它,就像在活动布局)

为了得到我期望的结果,我在片段类中这样做:

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);

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

4

2 回答 2

4

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

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

例子 -

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

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

于 2018-04-25T10:23:21.717 回答
0

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

您需要做的是移动可访问性焦点。

myCustomView.requestFocus();

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

myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

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

于 2015-09-17T12:28:40.610 回答