Android изменить порядок доступности с setAccessibilityTraversalAfter () не работает - PullRequest
4 голосов
/ 28 февраля 2020

Я хочу изменить порядок доступности, порядок, в котором программа чтения с экрана, TalkBack в этом случае Android, считывает элементы после нажатия кнопки. Это то, что я пробовал на данный момент, но это не работает, порядок по-прежнему исходные по убыванию. (В моем примере кнопки расположены в порядке b1, b2, b3, и после того, как я нажимаю кнопку изменения порядка кнопок, я хочу, чтобы порядок стал b3, b1, b2).

CODE:

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


    }

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Ваши Button s не имеют идентификаторов, поэтому, когда вы звоните getId() в b3.setAccessibilityTraversalBefore(b1.getId()); и т. Д. c., Вы получаете View.NO_ID, поэтому порядок обхода не установлен правильно.

Чтобы исправить это, определите некоторые идентификаторы в 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);

(и то же самое для остальных кнопок)

0 голосов
/ 28 февраля 2020

Это был слишком длинный комментарий, а не «ответ» как таковой.

Не пытайтесь изменить порядок обхода активного элемента (которым будет кнопка когда вы нажимаете это).

т.е. удалить бит 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.
...