Android 使用 setAccessibilityTraversalAfter() 更改无障碍顺序无效

Android change accessibility order with setAccessibilityTraversalAfter() not working

我想要的是更改辅助功能顺序,屏幕 reader 中的 TalkBack Android 情况下的顺序,在按下按钮后读取元素。这是我到目前为止尝试过的方法,但它不起作用,顺序仍然是最初的降序。 (在我的示例中,按钮的顺序为 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);


    }

This was too long for a comment, not an 'answer' as such.

不要尝试更改活动元素的遍历顺序(按下按钮时按钮的顺序)。

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

另请记住,您只需要使用一个版本的 setAccessibilityTraversal as
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.

您的 Button 没有 ID,因此当您调用 getId() in b3.setAccessibilityTraversalBefore(b1.getId());, etc., you're getting 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);

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