如何在Android Studio中设置开关或切换按钮的内容描述?

3

我希望我能使我的应用程序支持Tlkback,但我不知道如何为开关或切换按钮的两种状态设置不同的内容描述。

你有什么建议吗?

2个回答

2
您可以通过编程的方式来设置内容描述,如下所示。
toggleButton.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick( View v ) {
            if( toggleButton.isChecked() ) {
                toggleButton.setContentDescription( "Selected" );
            } else {
                toggleButton.setContentDescription( "Unselected" );
            }
        }
    } );

1
使用 AccessibilityNodeInfosetCheckedsetCheckable 方法。详情请参考:https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#setCheckable(boolean)
class MyAccessibilityDelegate extends View.AccessibilityDelegate {

  MyButton button;

  public constructor (MyButton button) {
    this.button = button;
  }

  @Override
  public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(host, info);
    
    info.setCheckable(true);
    info.setChecked(button.getChecked());

然后将代理添加到您的视图/布局等中。

class MyButton extends View {
...
  public constructor() {
    setAccessibilityDelegate(new MyAccessibilityDelegate(this);
  }
...
}

解释:所有辅助功能服务都应使用AccessibilityNodeInfo来确定什么被大声朗读。 setCheckable使服务意识到View具有可修改的状态,而setChecked实际上更改了“选中/未选中”呼叫。


如果一个视图/行有几个TextView和一个Switch,我们需要将MyAccessibilityDelegate添加到视图的根部,以便TalkBack一起读取所有内容。然后,新问题将是,TalkBack将更早地读取Switch的状态。 - Dr.jacky
如果您希望辅助功能焦点停留在根视图上,则可以在根视图的xml中设置importantForAccessibility=true。 TalkBack将自动汇总所有子视图的辅助功能信息,并按照辅助功能顺序阅读它们,包括具有MyAccessibilityDelegate的子MyButton - essen_star
我的问题是根节点具有 importantForAccessibility="yes",但 TalkBack 读取除 Switch 之外的所有子元素!这就是我来到这个问题和答案的原因。尝试使用委托设置 cd,但也没有起作用。(我尝试了在 Switch 和父级上都设置委托的解决方案) - Dr.jacky
1
哦,有趣。您的根视图是什么类?您是否尝试过检查node info tree?不知道更多信息的情况下,我的猜测是Switch没有被设置为辅助功能的子项。 - essen_star
根视图是 CardView。然后下一个父级是 ConstraintLayout - Dr.jacky

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