Невозможно установить фокус на доступность заголовка.
У меня есть 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)
}