Talkback по умолчанию не фокусируется ни на каком виде в начале внутреннего фрагмента

Я использую функцию обратной связи для специальных возможностей, и я столкнулся с одной проблемой: у меня есть одна нижняя навигация в родительском действии, и на вкладке настроек я открываю другой фрагмент (внутренний фрагмент), используя .add, но представление внутреннего фрагмента не получает фокус по умолчанию

Я также пробовал с . replace, но по умолчанию он не фокусируется на создании фрагментов.

код открытого фрагмента

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

и я использовал эту функцию расширения, чтобы не фокусироваться на предыдущем фрагменте из этого источник

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"

и запросить фокус, но он не работает

Пожалуйста, предложите мне, что любая помощь будет высоко оценена


person Chirag Patel    schedule 15.10.2020    source источник


Ответы (1)


Мне больше всего повезло с использованием

view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)

на вид, который вы хотите сфокусировать, или, может быть,

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

чтобы позволить системе делать то, что она делает, а затем через мгновение вмешаться и принудительно сменить фокус.

Но это можно считать плохой доступностью, если это мешает обычной навигации, и, возможно, именно поэтому так сложно заставить фокус работать постоянно! Возможно, лучше просто объявить о новом фрагменте (например, view.announceForAccessibility("new fragment")) и позволить пользователю начать навигацию сверху. Это зависит от вашего приложения, это ваш звонок

Также вы, вероятно, захотите использовать replace для своего фрагмента вместо add, если вы добавите фрагмент поверх старого, TalkBack может застрять при просмотре невидимых представлений на старом фрагменте.

person cactustictacs    schedule 15.10.2020
comment
Я пробовал и .add, и. заменить, но внутренний фрагмент по умолчанию не получает фокус - person Chirag Patel; 15.10.2020
comment
add проблема больше, если вы проводите навигацию по экрану, и она фокусируется на представлениях, которые вы больше не можете видеть, как будто она застряла на старом фрагменте. replace просто избегает этого, это не приведет к установке фокуса по умолчанию. Попробуйте AccessibilityEvent штуку, это то, что у меня работает, но только иногда с доступностью действительно сложно работать :( - person cactustictacs; 15.10.2020
comment
Спасибо, я только что реализовал это, и он работает как шарм - person Chirag Patel; 16.10.2020
comment
да, вы правы, я получаю старый фрагментный вид навигации - person Chirag Patel; 16.10.2020