默认情况下,对讲不关注内部片段开始时的任何视图

talkback not focusing by default on any view on start of inner fragment

我正在使用可访问性对讲功能,但我遇到了一个问题,我在父级 activity 中有一个底部导航,在设置选项卡中,我正在使用 .add 打开另一个片段(内部片段)但默认情况下内部片段视图未获得焦点

我也试过 . replace 但默认情况下它不关注片段创建。

打开片段代码

val details = DetailsFragment.newInstance();
getSupportFragmentManager().setupForAccessibility()
getSupportFragmentManager().beginTransaction().add(android.R.id.content, details).commit() 

并且我使用了这个扩展函数来不关注这个 source

的前一个片段
fun FragmentManager.setupForAccessibility() {
    addOnBackStackChangedListener {
        val lastFragmentWithView = fragments.lastOrNull { it.view != null }
        for (fragment in fragments) {
            if (fragment == lastFragmentWithView) {
                fragment.view?.importantForAccessibility =
                        View.IMPORTANT_FOR_ACCESSIBILITY_YES
            } else {
                fragment.view?.importantForAccessibility =
                        View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
            }
        }
    }
}

在正常情况下,我显示在第一个片段的开头它先聚焦顶部 Textview 并自动说话但在内部片段中它默认不聚焦所以我应该怎么做才能默认聚焦默认第一个视图

我已经试过了

android:focusable="true"
android:focusableInTouchMode="true"

并请求焦点,但它不起作用

如有任何帮助,请向我提出建议,我们将不胜感激

我最幸运的是使用

view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)

在您想要关注的视图上,或者

Handler().postDelayed({
    view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
}, someDelayMillis)

让系统做任何它做的事,然后在片刻之后跳入并强制改变焦点。

但这可能会被认为是不好的可访问性,如果它干扰了通常的导航,这可能就是为什么很难始终如一地集中注意力的原因!最好只宣布新片段(使用 view.announceForAccessibility("new fragment") 之类的东西)并让用户从顶部开始导航。这取决于您的应用,由您决定

您可能还想为您的片段使用 replace 而不是 add,如果您在旧片段之上添加一个片段,TalkBack 可能会在查看“不可见”视图时卡住在旧片段