如何在片段的视图中激活对讲?
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);
在处理片段时,我喜欢同时调用焦点、输入焦点(就像上一个答案中的那个人所说的那样)和可访问性焦点,因为在片段上实现可访问性时,您可能会遇到一些恼人的问题。因此这总是为我做的工作。
我目前正在将辅助功能作为一项新功能添加到我的应用程序中。 我的目标是用户将使用 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);
在处理片段时,我喜欢同时调用焦点、输入焦点(就像上一个答案中的那个人所说的那样)和可访问性焦点,因为在片段上实现可访问性时,您可能会遇到一些恼人的问题。因此这总是为我做的工作。