Есть ли способ программной прокрутки прокрутки к определенному тексту редактирования?

У меня очень долгое действие с scrollview. Это форма с различными полями, которые пользователь должен заполнить. У меня есть флажок на полпути вниз по форме, и когда пользователь проверяет его, я хочу перейти к определенной части представления. Есть ли способ программно перейти к объекту EditText (или любому другому объекту представления)?

Кроме того, я знаю, что это возможно с использованием координат X и Y, но я хочу избежать этого, поскольку форма может изменяться от пользователя к пользователю .

187
задан GingerHead 13 May 2014 в 07:47
поделиться

1 ответ

Я знаю, что это может быть слишком опаздывающим, лучше отвечают, но желаемое идеальное решение должно быть системой как позиционер. Я имею в виду, когда система делает расположение для поля Editor, она помещает поле только до клавиатуры, поэтому поскольку UI/UX постановляет, что это прекрасно.

то, Что ниже кода делает, является способом Android расположить гладко. В первую очередь, мы сохраняем текущую точку прокрутки как контрольную точку. Вторая вещь состоит в том, чтобы найти лучшую точку прокрутки расположения для редактора, чтобы сделать это мы прокручиваем к вершине и затем запрашиваем поля редактора сделать компонент ScrollView, чтобы сделать лучшее расположение. Gatcha! Мы изучили лучшее положение. Теперь, то, что мы сделаем, прокрутить гладко от предыдущей точки до точки, которую мы нашли недавно. Если Вы хотите Вас, может опустить гладкую прокрутку при помощи scrollTo вместо smoothScrollTo только.

ПРИМЕЧАНИЕ: основной контейнерный ScrollView является членским полем, названным scrollViewSignup, потому что моим примером был экран регистрации, поскольку можно выяснить много.

view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(final View view, boolean b) {
            if (b) {
                scrollViewSignup.post(new Runnable() {
                    @Override
                    public void run() {
                        int scrollY = scrollViewSignup.getScrollY();
                        scrollViewSignup.scrollTo(0, 0);
                        final Rect rect = new Rect(0, 0, view.getWidth(), view.getHeight());
                        view.requestRectangleOnScreen(rect, true);

                        int new_scrollY = scrollViewSignup.getScrollY();
                        scrollViewSignup.scrollTo(0, scrollY);
                        scrollViewSignup.smoothScrollTo(0, new_scrollY);
                    }
                });
            }
        }
    });

, Если Вы хотите использовать этот блок для всего экземпляры EditText и быстро интегрировать его с Вашим экранным кодом. Можно просто сделать traverser как ниже. Чтобы сделать это, я сделал основной OnFocusChangeListener членским полем названный focusChangeListenerToScrollEditor и называю его во время onCreate как ниже.

traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);

И реализация метода как ниже.

private void traverseEditTextChildren(ViewGroup viewGroup, View.OnFocusChangeListener focusChangeListenerToScrollEditor) {
    int childCount = viewGroup.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View view = viewGroup.getChildAt(i);
        if (view instanceof EditText)
        {
            ((EditText) view).setOnFocusChangeListener(focusChangeListenerToScrollEditor);
        }
        else if (view instanceof ViewGroup)
        {
            traverseEditTextChildren((ViewGroup) view, focusChangeListenerToScrollEditor);
        }
    }
}

Так, то, что мы сделали здесь, делает всех детей экземпляра EditText для вызова слушателя в фокусе.

Для достижения этого решения я проверил его все решения здесь и генерировал новое решение для лучше результата UI/UX.

Many thanks to all other answers inspiring me much.
4
ответ дан 23 November 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: