【问题标题】:Android: change accessibility order programmaticallyAndroid:以编程方式更改可访问性顺序
【发布时间】:2020-02-28 14:55:53
【问题描述】:

有没有办法改变屏幕阅读器(在 Android 情况下为 TalkBack)必须读取可访问元素的顺序? 就像我有 3 个元素,最初按 b1、b2、b3 的顺序读取,当我按下某个按钮后,顺序会改变并变为 b3、b1、b2?

编辑 这是我按照@Nikos Hidalgo 提示尝试的方法

代码:

    Button b1,b2,b3, changeorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    LinearLayout linearlayout = findViewById(R.id.linearlayout);

    changeorder = new Button(this);
    changeorder.setText("Presso to change order");
    changeorder.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("BUTTON","Clicked change order button");

            changeorder.setAccessibilityTraversalBefore(b3.getId());
            b3.setAccessibilityTraversalAfter(changeorder.getId());
            b3.setAccessibilityTraversalBefore(b1.getId());
            b1.setAccessibilityTraversalAfter(b3.getId());
            b1.setAccessibilityTraversalBefore(b2.getId());
            b2.setAccessibilityTraversalAfter(b1.getId());
            changeorder.setText("Order changed b3,b1,b2");

        }
    });
    changeorder.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
    linearlayout.addView(changeorder);

    b1 = new Button(this);
    b1.setText("BUTTON 1");
    b1.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
    linearlayout.addView(b1);


    b2 = new Button(this);
    b2.setText("BUTTON 2");
    b2.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
    linearlayout.addView(b2);


    b3 = new Button(this);
    b3.setText("BUTTON 3");
    b3.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
    linearlayout.addView(b3);


    }

【问题讨论】:

  • 您能解释一下为什么您希望可访问性顺序不同于 DOM 中的顺序或 tab 顺序吗?否则,您很可能会引入可访问性问题和错误,而不是解决它们。
  • @GrahamRitchie 因为在元素可以在屏幕上移动的应用程序中,例如使用拖放的应用程序,在某些视图移动后,我需要重新排列它们的可访问性顺序。

标签: java android accessibility screen-readers talkback


【解决方案1】:

您可以使用以下方法以编程方式定义/更改遍历顺序(在 TalkBalk 中解析视图的顺序):

public void setAccessibilityTraversalAfter (int afterId)

设置在可访问性遍历中访问该视图的 id。屏幕阅读器必须先访问另一个视图的内容,然后再访问该视图的内容。例如,如果视图 B 设置在视图 A 之后,那么屏幕阅读器将在遍历 B 的全部内容之前先遍历 A 的全部内容,而不管 [原文如此] 它使用的是什么遍历策略。

(source)

public void setAccessibilityTraversalBefore (int beforeId)

设置在可访问性遍历中访问该视图之前的视图的 id。屏幕阅读器必须先访问该视图的内容,然后才能访问它之前的内容。例如,如果视图 B 设置在视图 A 之前,那么屏幕阅读器将在遍历 A 的全部内容之前先遍历 B 的全部内容,而不管 [原文如此] 它使用的是什么遍历策略。

(source)

由于它们都是 View 的公共方法,您可以像这样使用它们:

findView(R.id.view1).setAccessibilityTraversalBefore(R.id.view2);

编辑: 确保您的所有视图都是可聚焦的,如果您以编程方式添加更多视图,请确保设置 importantForAccessibility 属性。

例如myView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);

【讨论】:

  • 我试过有 3 个按钮(b1、b2、b3),在按下 4° 按钮后,我使用了b1.setAccessibilityTraversalAfter(b3.getId());b2.setAccessibilityTraversalAfter(b1.getId()); 将顺序更改为 b3、b1、b2,但没有发生了
  • @Poli97 按钮是动态创建的吗?我想知道是否取决于您何时以及如何绑定您需要重新启动活动的视图。如果您可以编辑您的问题以添加所有相关代码,那么可能会更容易看到发生了什么。
  • 是的,按钮是动态创建的。我尝试使用您的建议myView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES),但它也不起作用。我编辑了问题并添加了我尝试过的代码。顺便谢谢你的帮助
  • 嘿,你找到解决办法了吗?
  • @Poli97 抱歉,该解决方案过去对我有用。更改顺序后尝试在视图上调用 invalidate() 以强制它们重绘,看看是否有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多