我正在使用辅助功能对讲功能,我面临一个问题,我在父事件中有一个底部导航,并且在设置选项卡中我使用 .add
打开另一个片段(内部片段),但是默认情况下,内部片段 View 未获得焦点
我也尝试过使用。替换
,但默认情况下它并不专注于片段创建。
打开片段代码
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
并自动说话,但在内部片段中,默认情况下它不聚焦,所以我应该做什么才能默认获得焦点默认情况下在第一个 View 上
我已经尝试了
android:focusable="true"
android:focusableInTouchMode="true"
并请求焦点,但它不起作用
请向我建议任何帮助,我将不胜感激
最佳答案
我使用起来非常幸运
view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
在您想要聚焦的 View 上,或者也许
Handler().postDelayed({
view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
}, someDelayMillis)
让系统做它该做的任何事情,然后稍后跳入并强制改变焦点。
但是,如果它干扰了通常的导航,这可能会被认为是不好的可访问性,这可能就是为什么很难让焦点持续工作的原因!最好只是宣布新片段(使用类似 view.announceForAccessibility("newfragment")
的内容)并让用户从顶部开始导航。这取决于您的应用,由您决定
此外,您可能希望对片段使用 replace
而不是 add
,如果您在旧片段之上添加片段,TalkBack 可能会卡在查看片段上旧片段的“不可见” View
关于kotlin - 默认情况下,对讲不关注内部片段开始时的任何 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64377154/