【问题标题】:Android change accessibility order with setAccessibilityTraversalAfter() not workingAndroid 使用 setAccessibilityTraversalAfter() 更改可访问性顺序不起作用
【发布时间】:2020-02-28 16:47:19
【问题描述】:

我想要的是更改可访问性顺序,即屏幕阅读器的顺序,即 Android 案例中的 TalkBack 在按下按钮后读取元素的顺序。这是我迄今为止尝试过的,但它不起作用,顺序仍然是最初的降序。 (在我的示例中,按钮的顺序为 b1、b2、b3,在我按下按钮更改顺序后,我希望顺序变为 b3、b1、b2)。

代码:

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


    }

【问题讨论】:

    标签: java android accessibility screen-readers talkback


    【解决方案1】:

    您的Buttons 没有ID,因此当您在b3.setAccessibilityTraversalBefore(b1.getId()); 等中调用getId() 时,您将得到View.NO_ID,因此未正确设置遍历顺序。

    要修复它,define some IDs in XML:

    <resources>
        <item type="id" name="changeOrderButton" />
        <item type="id" name="button1" />
        <item type="id" name="button2" />
        <item type="id" name="button3" />
    </resources>
    

    然后在创建按钮时使用View.setId 将它们设置在按钮上:

    b1 = new Button(this);
    b1.setId(R.id.button1); // Add the ID so that accessibility traversal can identify this view
    b1.setText("BUTTON 1");
    b1.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
    linearlayout.addView(b1);
    

    (对其余按钮执行相同操作)

    【讨论】:

    • 谢谢大佬不知道,我以为按钮创建时会自动生成ID
    【解决方案2】:

    这对于评论来说太长了,而不是“答案”。

    不要尝试更改活动元素上的遍历顺序(当您按下它时,该按钮将是该元素)。

    即删除 changeorder.setAccessibilityTraversalBefore(b3.getId()); 位。

    还请记住,您只需要使用setAccessibilityTraversal 的一个版本,因为
    b3.setAccessibilityTraversalBefore(b1.getId());b1.setAccessibilityTraversalAfter(b3.getId()); 相同

    如此简化:-

    public void onClick(View v) {
            Log.i("BUTTON","Clicked change order button");
    
        b3.setAccessibilityTraversalAfter(changeorder.getId());
        b1.setAccessibilityTraversalAfter(b3.getId());
        b2.setAccessibilityTraversalAfter(b1.getId());
        changeorder.setText("Order changed b3,b1,b2");
        etc.
    

    【讨论】:

    • 我也尝试过这种方式,但它不起作用,在我发布的代码中我尝试使用所有版本,因为我没有尝试过
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2021-10-31
    • 2017-08-26
    相关资源
    最近更新 更多