Android无障碍如何修改播报

Android无障碍对checkbox控件默认的播报状态内容是已勾选和未勾选,但是我想改变他的播报状态内容变成已选中和未选中,我是用的是setStateDescription,但是这个方法在Android29的时候会编译报错,我还如何避免编译报错并且能够改变播报内容呢

可以使用 android:contentDescription 属性来改变 CheckBox 控件的无障碍辅助功能播报文本。

例如,要将 CheckBox 的无障碍辅助功能播报文本改为“已选中”和“未选中”,可以在布局文件中的 CheckBox 控件中使用以下内容:

android:contentDescription="@string/checkbox_selected"

然后,在你的应用的 strings.xml 文件中定义两个字符串资源:

<string name="checkbox_selected">已选中</string>
<string name="checkbox_unselected">未选中</string>

最后,在你的应用的代码中,设置 CheckBox 的 contentDescription 属性,以在用户选中或取消选中 CheckBox 时更新辅助功能播报文本:

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            checkBox.setContentDescription(getString(R.string.checkbox_selected));
        } else {
            checkBox.setContentDescription(getString(R.string.checkbox_unselected));
        }
    }
});

这样,当用户使用无障碍工具访问 CheckBox 时,将听到“已选中”或“未选中”的播报。

试一下在布局文件中为 Checkbox 控件添加 contentDescription 属性,并设置为所需的播报内容。
代码:

<Checkbox
 android:id="@+id/checkbox"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:contentDescription="已选中"
 android:text="checkbox" />

在 Android 29 以上的系统中,setStateDescription 方法已经被废弃,不推荐使用。

要改变 CheckBox 控件的播报状态内容,可以使用 AccessibilityNodeInfoCompat 类的 setChecked(boolean) 和 setText(CharSequence) 方法来设置 CheckBox 的勾选状态和文本信息。

具体实现方法如下:
// 获取 CheckBox 的 AccessibilityNodeInfo 对象
AccessibilityNodeInfo nodeInfo = checkBox.getAccessibilityNodeInfo();
// 将 AccessibilityNodeInfo 对象包装成 AccessibilityNodeInfoCompat 对象
AccessibilityNodeInfoCompat nodeInfoCompat = AccessibilityNodeInfoCompat.wrap(nodeInfo);
// 设置 CheckBox 的勾选状态和文本信息
nodeInfoCompat.setChecked(isChecked);
nodeInfoCompat.setText(isChecked ? "已选中" : "未选中");
需要注意的是,在修改 CheckBox 的文本信息时,需要先设置勾选状态,再设置文本信息。这样才能让修改后的文本信息生效。

如果你使用的是 AndroidX 的 AccessibilityNodeInfoCompat 类,那么可以使用 setCheckable(boolean) 和 setText(CharSequence) 方法来设置 CheckBox 的勾选状态和文本信息。

具体实现方法如下
// 获取 CheckBox 的 AccessibilityNodeInfo 对象
AccessibilityNodeInfo nodeInfo = checkBox.getAccessibilityNodeInfo();
// 将 AccessibilityNodeInfo 对象包装成 AccessibilityNodeInfoCompat 对象
AccessibilityNodeInfoCompat nodeInfoCompat = AccessibilityNodeInfo

在 Android 29 版本中,setStateDescription 方法已经被废弃,不再推荐使用。如果想要在 Android 29 版本中修改 CheckBox 控件的播报状态内容,可以使用 setContentDescription 方法来设置控件的内容描述。

如果想要将 CheckBox 控件的播报状态内容设置为已选中和未选中,可以使用以下代码:

checkBox.setContentDescription("已选中");
checkBox.setContentDescription("未选中");

在设置内容描述时,应该根据控件的实际状态来设置对应的内容描述。

如果希望在 Android 29 版本中使用 setStateDescription 方法,可以使用 Reflection API 来调用该方法,例如

Method setStateDescriptionMethod = CheckBox.class.getMethod("setStateDescription", int.class, CharSequence.class);
setStateDescriptionMethod.invoke(checkBox, AccessibilityNodeInfo.STATE_CHECKED, "已选中");
setStateDescriptionMethod.invoke(checkBox, AccessibilityNodeInfo.STATE_UNCHECKED, "未选中");

1、第一种方式:使用【android:contentDescription】属性,然后在java代码里面动态的设置这个显示的文本。
2、第二种方式:使用【CheckBox】和【TextView】自定义一个组件,CheckBox用于显示框框,TextView用于显示选中之后的文本,在java代码里面通过判断CheckBox是否选中,来动态的设置TextView显示的文本。

Android TTS语音播报实践
借鉴下
https://blog.csdn.net/bugyinyin/article/details/127688096

您可以点击sdk api查看,setStateDescription 这个方法已经废弃了,建议使用setContentDescription即可

对于 Android 无障碍服务来说,在 Android 29 版本以后,推荐使用 setAccessibilityStateDescription 方法来设置播报内容,该方法用于为控件设置状态描述,而不是 setStateDescription.

您可以在以下位置设置状态描述:

checkbox.setAccessibilityStateDescription(AccessibilityState.CHECKED, "已选中");
checkbox.setAccessibilityStateDescription(AccessibilityState.UNCHECKED, "未选中");

这里最好是使用AccessibilityState.CHECKED和AccessibilityState.UNCHECKED来进行设置,这样在以后可能升级或更换新的手机时可以更能够正常工作。使用这种方法设置状态描述会使应用程序能够适应未来的变化,并且在升级或更换新的手机后不需要进行额外的修改。

需要注意的是,对于使用 setAccessibilityStateDescription 方法设置的状态描述,它不会对屏幕阅读器的默认语音化进行更改。可以使用第三方屏幕阅读器软件来访问自定义状态描述。

总之,在 Android 29 及以后版本中使用 setAccessibilityStateDescription 设置播报状态更加可靠,并且能够适应未来的变化.

希望对您有所帮助!望采纳。

在 Android 29 及更高版本中,setContentDescription() 和 setStateDescription() 方法用于设置 checkbox 控件的播报状态内容已过时。相反的建议是使用新的 AccessibilityNodeInfo.AccessibilityAction 类。

可以通过以下步骤来改变 checkbox 控件的播报状态内容:

  1. 首先实现一个新的 View.AccessibilityDelegate 类来扩展现有的 CheckBox 类的辅助功能。
  2. 使用 AccessibilityDelegate 类的 onInitializeAccessibilityNodeInfo() 方法来自定义 checkbox 的播报状态内容。
  3. 在 onInitializeAccessibilityNodeInfo() 方法中为 checkbox 添加新的 AccessibilityAction 对象来更改默认的播报状态内容。
  4. 新建一个 AccessibilityNodeInfo.AccessibilityAction 对象来定义新的播报状态内容
  5. 通过 checkbox.setAccessibilityDelegate(accessibilityDelegate) 将新的 accessibilityDelegate 传递给 checkbox。
    相关代码示例:
CheckBox checkbox = findViewById(R.id.checkbox);

AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        // Add custom action for checking and unchecking.
        info.addAction(new AccessibilityNodeInfo.AccessibilityAction(
                AccessibilityNodeInfo.ACTION_CLICK, "Checked"));
        info.addAction(new AccessibilityNodeInfo.AccessibilityAction(
                AccessibilityNodeInfo.ACTION_CLEAR_SELECTION, "Un


续上文,如果你想要改变checkbox控件的播报状态内容为已选中和未选中,可以使用以下代码

AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        // Add custom action for checking and unchecking.
        info.addAction(new AccessibilityNodeInfo.AccessibilityAction(
                AccessibilityNodeInfo.ACTION_CLICK, "Checked"));
        info.addAction(new AccessibilityNodeInfo.AccessibilityAction(
                AccessibilityNodeInfo.ACTION_CLEAR_SELECTION, "Unchecked"));
    }
};

checkbox.setAccessibilityDelegate(accessibilityDelegate);

这样,无论checkbox控件处于什么状态,系统都会读取你自定义的“Checked”和“Unchecked”,而不是默认的“已勾选”和“未勾选”。

注意,需要确保 AccessibilityNodeInfo.ACTION_CLICK 和 AccessibilityNodeInfo.ACTION_CLEAR_SELECTION是可用的。

如果你还是出现编译报错的话,建议检查一下代码的语法和语义,并确保你使用的是最新的Android SDK,并且应用了最新的编译工具