为Android Talkback设置选项菜单内容描述

12

我正在为一款应用实现"朗读"或"Talkback"功能。使用 contentDescription 文本,一切正常,但是在选项菜单中,我发现没有相关的 contentDescription,我希望系统可以朗读"菜单+选项名称"。

例如:我的菜单有两个选项:"创建新文件夹"和"删除当前文件夹"。目前,当我聚焦到一个菜单项(支持轨迹球和蓝牙按键)时,系统可以准确地朗读菜单的文本。但我希望它更像这样朗读:" 1: 菜单创建新文件夹" 和 "2: 菜单删除当前文件夹"。

那么,我该如何改变朗读文本?如何在蓝牙键盘按下UP/DOWN键时获取聚焦的菜单项


当您设置btn.setContentDescription("Menu: " + "Create blabla");并且btn.requestFocus()时会发生什么? - JSBach
5个回答

17

在v4支持库中的MenuItemCompat具有

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

在早期的 Android Oreo 设备上实现向后兼容的方法。

有关 AndroidX,请参见此答案:

https://dev59.com/OloV5IYBdhLWcg3wA6-x#57950952


你能提供一个更好的例子吗?我的Android Studio无法识别该代码的“view”部分。也许需要在页面顶部和gradle.app中导入它? - Alan Nelson
1
你现在应该使用AndroidX而不是V4支持库。请参见https://dev59.com/OloV5IYBdhLWcg3wA6-x#57950952以获取有关AndroidX支持的信息。您需要在build.gradle文件中包含AndroidX依赖项。 - tim.paetz

13
根据我的调查,在 Android 的内部源代码中,类 ActionMenuItemView.java 的方法 setTitle(CharSequence title) 中,源代码还设置了 setContentDescription(title),因此 Android 将读取您的菜单项文本作为默认值。我不知道为什么在这种情况下核心如此不灵活。
更新: 感谢 @sofakingforever answer。 看起来 Google 刚刚在 API 26(Android O)上向 MenuItem 类添加了 setContentDescription(CharSequence contentDescription) 方法。
更新: 感谢新的 @tim.paetz answer。 看起来现在所有版本都支持使用 android support v4 库为菜单项设置 setContentDescription

你有没有想到可能的解决方案或想法?我们可以用扩展来覆盖它吗?因为我认为我有类似的问题,http://stackoverflow.com/questions/36971528/android-seekbar-talkback-talking-too-much - JSBach
抱歉反馈晚了,但是我仍然没有解决我的问题。 - NamNH
没问题。是的,我也没有。所以我创建了一个空标签并继续进行。看起来,Spotify 也无法解决这个问题。当我检查时,他们也遇到了类似的问题。 - JSBach

7

这篇 回答涉及 AndroidX 技术

androidx.core.view.MenuItemCompat.setContentDescription(menuItem,  contentDescription)

2

看起来他们在API 26(Android O)中向MenuItem类添加了setContentDescription(CharSequence contentDescription)方法。


是的,我看到这个方法现在可以在Android O Developer Preview上使用,但还没有测试过。但是,我希望它能够正常工作。 :) - NamNH
3
另外,在菜单的XML中添加app:contentDescription(而不是android:contentDescription)对于我来说似乎在早期版本上有效。 - dasfima

1

完整示例:

@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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接