Как переопределить поведение прокрутки по умолчанию в OS 6 - PullRequest
3 голосов
/ 11 августа 2011

У меня есть собственное расширение VerticalFieldManager, которое автоматически прокручивает себя для отображения данных пользователю.Как над, так и под этим VFM существуют другие компоненты, с которыми пользователь может взаимодействовать.На OS5 это работает отлично и именно так, как я ожидаю.В OS6 со встроенной функцией «плавной прокрутки», когда пользователь пытается прокрутить из полей над VFM до полей ниже, VFM прокручивается вводом пользователя перед переносом фокуса на поля под VFM.

Есть ли способ отменить это поведение и сказать ОС оставить мой VFM в покое?В OS5 это было просто, потому что VFM не фокусировался.

Я попытался поиграться с вертикальной регулировкой и вертикальным квантованием на VFM, но безуспешно.VFM никогда не получает фокус, ОС просто прокручивает его.Я предполагаю, что ОС думает, что это полезно, но это не так!:)

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Я нашел решение, переопределив функцию navigationMovement в родительском Диспетчере, что-то вроде этого:

protected boolean navigationMovement(int dx, int dy, int status, int time) {
    if (getField(getFieldWithFocusIndex()) == tabbar) {
        Field f = tabbar.getFieldWithFocus();
        if (f == lastTabButton) {
            if (dy > 0) {
                tabData.setFocus();
                return true;
            }
        } else if (f == firstTabButton) {
            if (dy < 0) {
                return true;
            }
        }
    } else if (getField(getFieldWithFocusIndex()) == tabData) {
        MyTab tab = (MyTab) tabs.get(tabData);
        if (tab != null && !tab.willHandleNavigationMovement(dx, dy)) {
            if (dy != 0) {
                if (dy < 0)
                    lastTabButton.setFocus();
                return true;
            }
        }
    }

    return super.navigationMovement(dx, dy, status, time);
}

В приведенном выше коде вы увидите, что мне пришлось также переопределить поведение при прокруткевверх от самого верха и прокручивая вниз от самого низа, потому что операционная система снова взяла верх и «помогла» мне прокрутить нефокусируемый VFM.

1 голос
/ 11 августа 2011

Вы можете связываться с nextFocus() в родительском диспетчере, чтобы просто пропустить средний VFM. Возможно также переопределить onFocus() для середины, чтобы просто перейти к следующему. Я знаю, что он должен делать это, устанавливая его без фокуса, но, возможно, переопределите isFocusable(), чтобы вернуть false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...