Настройка описания содержимого для меню параметров android Talkback

Я реализую "Read Aloud" или "Talkback" для приложения. Все работает с текстом contentDescription, но в меню опций я не нашел ничего, связанного с contentDescription, я хочу, чтобы система читала "Menu "+ item's name.

ПРИМЕР: В моем меню есть 2 пункта: «Создать новую папку» и «Удалить текущую папку», в настоящее время, когда я фокусирую элемент меню (поддержка трекбола и клавиши Bluetooth), система может говорить именно текст меню. Но я хочу, чтобы это больше напоминало «1: Меню «Создать новую папку»» и «2: Меню «Удалить текущую папку»".

Итак, как я могу изменить прочитанный текст? Как я могу получить сфокусированное menu item, когда клавиатура Bluetooth нажимает клавишу UP/DOWN?


person NamNH    schedule 22.04.2016    source источник
comment
Что происходит, когда вы устанавливаете btn.setContentDescription (Меню: + Создать blabla); а затем btn.requestFocus()?   -  person JSBach    schedule 03.05.2016


Ответы (5)


MenuItemCompat в библиотеках поддержки v4 имеет

android.support.v4.view.MenuItemCompat.setContentDescription(MenuItem menuItem, CharSequence contentDescription) 

метод обратной совместимости на устройствах до Oreo.

Для AndroidX см. этот ответ:

https://stackoverflow.com/a/57950952/1236327

person tim.paetz    schedule 28.09.2017
comment
Можете ли вы привести лучший пример для этого? Часть этого кода «просмотр» не распознается моей студией Android. Возможно, его нужно импортировать вверху страницы и в gradle.app? - person Alan Nelson; 23.03.2020
comment
На данный момент вам, вероятно, следует использовать AndroidX вместо библиотек поддержки V4. См. stackoverflow.com/a/57950952/1236327 для поддержки AndroidX. Вам нужно будет включить зависимость AndroidX в файл build.gradle. - person tim.paetz; 23.03.2020

По моему исследованию, во внутреннем исходном коде Android, метод класса ActionMenuItemView.java setTitle(CharSequence title), исходный код также устанавливает setContentDescription(title), поэтому Android будет читать текст вашего MenuItem по умолчанию. Я не знаю, почему ядро ​​​​такое негибкое в этом случае.

Обновлено:

Спасибо за ответ @sofakingforever.

Кажется, Google только что добавил метод setContentDescription(CharSequence contentDescription) в класс MenuItem в API 26 (Android O).

Обновлено: спасибо за новый ответ @tim.paetz . Похоже, теперь все версии поддерживаются setContentDescription для пунктов меню с использованием android support v4 библиотек.

person NamNH    schedule 04.05.2016
comment
Вы придумали возможное решение или идею? Можем ли мы перезаписать его расширением? Поскольку у меня, я думаю, похожая проблема, stackoverflow.com/questions/36971528/ - person JSBach; 11.05.2016
comment
Извините за поздний отзыв, но у меня до сих пор нет решения по моей проблеме. - person NamNH; 16.05.2016
comment
без проблем. да у меня тоже нет. Так что сделал пустую метку и пошел дальше. Похоже, Spotify тоже не смог решить эту проблему. У них была аналогичная проблема, когда я проверял. - person JSBach; 18.07.2016

этот ответ на сообщение AndroidX

androidx.core.view.MenuItemCompat.setContentDescription(menuItem,  contentDescription)
person Amit    schedule 16.09.2019

Кажется, они только что добавили метод setContentDescription(CharSequence contentDescription) в класс MenuItem в API 26 (Android O)

person dasfima    schedule 22.06.2017
comment
Да, я видел, что этот метод теперь доступен на Android O Developer Preview, но не тестировался. Но, надеюсь, это сработает. :). - person NamNH; 22.06.2017
comment
Кроме того, добавление app:contentDescription (не android:contentDescription) в XML меню, похоже, работает для меня в более ранних версиях. - person dasfima; 26.07.2017

Полный образец:

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.client_menu_close, menu);
    super.onCreateOptionsMenu(menu, inflater);

    MenuItem closeMenu = menu.findItem(R.id.client_menu_close_action);
    androidx.core.view.MenuItemCompat.setContentDescription(closeMenu, R.string.str_accessibility_client_screen_close);
}
person Thiago    schedule 14.09.2020