Невозможно установить фокус на доступность заголовка.

У меня есть EditText для действия, которое запрашивает фокус при запуске действия. Это отлично подходит для пользователей, у которых не включен TalkBack. Однако для обеспечения доступности (т. Е. Для пользователей, у которых включен TalkBack), мне нужно установить фокус на заголовке экрана вместо EditText.

Я пробовал несколько вещей, но не смог установить фокус на текстовом представлении заголовка (я проверил, что titleTextView не возвращает ноль):

Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

TextView titleTextView = null;
//get the tool bar's title TextView
try
{
    Class<?> toolbarClass = Toolbar.class;
    Field titleTextViewField = toolbarClass.getDeclaredField("mTitleTextView");
    titleTextViewField.setAccessible(true);
    titleTextView = (TextView)titleTextViewField.get(toolbar);
}
catch (NoSuchFieldException | IllegalAccessException e)
{
    e.printStackTrace();
}

if (titleTextView != null)
{
    titleTextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
    AccessibilityManager manager = (AccessibilityManager)getSystemService(Context.ACCESSIBILITY_SERVICE);
    if (manager.isEnabled())
    {
        AccessibilityEvent e = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED);
        e.setSource(titleTextView);
        e.setEventType(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
        e.setClassName(getClass().getName());
        e.setPackageName(getPackageName());
        e.getText().add("Message");
        manager.sendAccessibilityEvent(e);          
    }

TitleTextView никогда не получает фокус, когда включен TalkBack.

Любая помощь будет оценена.

1 ответ

Решение

Я смог исправить это, переместив код в блок if, чтобы выполнить код в блоке только в том случае, если у пользователя включен TalkBack. А именно, accessibilityManager.isEnabled() будет иметь значение true, только если включен TalkBack:

AccessibilityManager am = (AccessibilityManager)getSystemService(Context.ACCESSIBILITY_SERVICE);
if (am.isEnabled())
{
    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
    setSupportActionBar(actionBar);
    toolbar.setFocusable(true);
    toolbar.setFocusableInTouchMode(true);
    try
    {               
        Class<?> toolbarClass = Toolbar.class;
        Field titleTextViewField = toolbarClass.getDeclaredField("mTitleTextView");
        titleTextViewField.setAccessible(true);
        TextView titleTextView = (TextView)titleTextViewField.get(toolbar);
        titleTextView.setFocusable(true);
        titleTextView.setFocusableInTouchMode(true);
    }
    catch (NoSuchFieldException | IllegalAccessException e)
    {               
        e.printStackTrace();            
    }
    toolbar.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
    AccessibilityEvent e = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
    e.setSource(toolbar);
    e.setEventType(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
    e.setClassName(getClass().getName());
    e.setPackageName(getPackageName());
    am.sendAccessibilityEvent(e);
}

В моем случае это работает (котлин):

view.post {
 this.isFocusable = true
 this.isFocusableInTouchMode = true
 this.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
}
Другие вопросы по тегам