Служба специальных возможностей Android взаимодействует с несколькими переключателями одновременно

Мне было интересно, есть ли хороший способ включить / выключить несколько переключателей одновременно с помощью службы специальных возможностей.

Итак, в основном у меня есть представление, содержащее RecyclerView, в котором около 40 переключателей, и мне нужен способ включить/выключить их как можно быстрее. Вот что я пробовал.

public static void scrollView(final AccessibilityNodeInfo nodeInfo) {

    if (nodeInfo == null) return;

    if (nodeInfo.isScrollable()) {
        if (nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    turnOffSwitches(nodeInfo);
                }
            }, 1000);

        }
    }
}

public static void turnOffSwitches(final AccessibilityNodeInfo parentView) {
    if (parentView.getClassName().equals("android.support.v7.widget.RecyclerView")) {
        for (int i = 0; i < parentView.getChildCount(); i++) {
            final AccessibilityNodeInfo child = parentView.getChild(i);
            final Boolean isLasteOne = (i == parentView.getChildCount() - 1);
            child.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            if (isLasteOne) {
                scrollView(parentView);
            }
        }
    }
}

Я даже попытался ввести задержку между действиями ACTION_CLICK, что немного помогло, но не решило мою проблему полностью. Итак, проблема, с которой я сталкиваюсь, заключается в том, что не все переключатели выключаются. Кажется, что есть предел скорости, с которой это можно сделать. Итак, мой вопрос: есть ли лучший способ сделать это?


person Saik    schedule 27.08.2019    source источник


Ответы (1)


ACTION_SCROLL_FORWARD - это не листание страниц, просто прокрутка некоторой части всей вашей матрицы элементов, а некоторые видимые уже переключены в состояние, поэтому в следующем цикле вы пытаетесь щелкнуть те, которые уже были переключены (следующая видимая область перекрывается с предыдущей)

  1. либо проверьте состояние вкл/выкл - если представление еще не находится в желаемом состоянии перед его изменением

  2. или проверьте event.getScrollX() и event.getScrollY(), если действие еще не было выполнено в этих границах

person ceph3us    schedule 08.10.2019