我目前在我的应用中添加辅助功能作为新功能。 我的目标是用户使用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);
有没有人遇到过类似的问题?
答案 0 :(得分:2)
不确定您是否仍在寻找解决方案,但未来寻求者:) -
很多时候,焦点请求只能在post / postdelay函数中调用一次。
示例 -
myCustomView.postDelayed(new Runnable() {
@Override
public void run() {
myCustomView.setFocusable(true);
myCustomView.requestFocus();
myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
}
},1000);
在处理片段时,我喜欢调用焦点,输入焦点,就像上一个答案中的人调用的那样,以及可访问性的焦点,因为在片段上实现可访问性时,你可以通过一些烦人的问题。因此,这总是为我做的工作。
答案 1 :(得分:0)
首先,重要的是要注意Fragments在正常活动中的功能与布局没有区别。片段只是构造代码的便捷方式。如果您将应用程序编码为一系列片段,或者单个活动中的一堆布局是相同的,那么Android / Accessibility API会看到什么。话虽如此,我相信您正在寻找的是以下内容:
您需要做的是移动辅助功能焦点。
myCustomView.requestFocus();
正在改变我认为的输入焦点。这对TalkBack没有任何影响,实际上除了你正在使用键盘导航,或者我们正在讨论的是EditText框之外,它实际上完全没有意义。你想要做的是移动辅助功能/ TalkBack焦点。这可以通过以下代码行完成:
myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
注意:请记住WCag 2.0标准,特别是在自动关注TalkBack用户时。对于没视力的用户来说,这可能会变得非常混乱!