Android:以编程方式更改可访问性顺序

Pol*_*i97 2 java android accessibility screen-readers talkback

有没有办法更改屏幕阅读器(在 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);


    }
Run Code Online (Sandbox Code Playgroud)

Nik*_*lgo 7

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

\n\n
public void setAccessibilityTraversalAfter (int afterId)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

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

\n
\n\n

来源

\n\n
public void setAccessibilityTraversalBefore (int beforeId)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

设置在可访问性遍历中访问此视图之前的视图的 ID。屏幕阅读器必须先访问该视图的内容,然后再访问其前一个视图的内容。例如,如果视图 B 设置为在视图 A 之前,则屏幕阅读器将在遍历 A 的整个内容之前遍历 B 的整个内容,无论[原文如此]它使用什么遍历策略。

\n
\n\n

来源

\n\n

由于它们\xe2\x80\x99都是 View 的公共方法,因此您可以像这样使用它们:

\n\n
findView(R.id.view1).setAccessibilityTraversalBefore(R.id.view2);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

例如myView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);

\n