Android Fragments 默认情况下,对讲不聚焦于内部片段开始处的任何视图

x8diyxa7  于 2022-12-13  发布在  Android
关注(0)|答案(2)|浏览(146)

我正在使用辅助功能对讲功能,但遇到了一个问题。我在父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"

并请求焦点,但没有作用
请给我建议任何帮助都将不胜感激

qgzx9mmu

qgzx9mmu1#

我有最好的运气使用

view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)

您想要聚焦的视图,或者

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

让系统做它做的任何事情,然后在片刻之后跳进去并强制焦点改变。
但如果干扰了正常的导航,这可能会被认为是不好的可访问性,这可能就是为什么很难让焦点持续工作的原因!最好只是宣布新的片段(比如view.announceForAccessibility("new fragment")),让用户从顶部开始导航。这取决于你的应用程序,这是你的决定
此外,您可能希望对片段使用replace而不是add,如果您在旧片段上添加片段,TalkBack可能会在查看旧片段上的“不可见”视图时卡住

yhuiod9q

yhuiod9q2#

这是我改进的代码,从@cactustictacs扩展而来

//target to specific a view
binding.getRoot().postDelayed(new Runnable() {
        @Override
        public void run() {
            binding.textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
        }
}, 300);

完整:https://github.com/dotrinh-PM/AndroidTalkback

相关问题