Остановить ScrollView от автоматической прокрутки до EditText - PullRequest
41 голосов
/ 30 мая 2011

Кажется, это обычная проблема без отличного решения, которое я нашел.Цель состоит в том, чтобы остановить ScrollView от автоматической прокрутки до EditText (или любого представления в этом отношении) с фокусом.

У вас есть несколько просмотров (Button s, TextView)s и т. д.) в ScrollView, одним из которых является EditText.При нажатии, скажем, на кнопку в пределах ScrollView, ScrollView прокручивается вниз до EditText (вне экрана).Это нежелательно, так как есть другие элементы, которые вы не хотите прокручивать с экрана.

Теперь я могу не допустить этого, когда на экране впервые появятся другие фокусируемые элементы в ScrollView.Тем не менее, общая проблема все еще существует.Пользователь прокручивает вручную до EditText, вводит некоторые цифры, затем прокручивает вверх (вверху экрана EditText), нажимает кнопку в ScrollView, и угадайте, что?ScrollView прокручивается до этого проклятого EditText.

Я думаю о расширении ScrollView и переопределении некоторых из методов, таких как findFocusableViewInBounds, но у меня есть ощущение, что я простоУ меня больше проблем.

Пожалуйста, помогите, если можете.

Я поиграл с такими вещами, как наличие высоты 0 EditText в верхней части моего ScrollView, добавление свойств элемента Next Focusable к другим элементам в ScrollView и т. Д. Я полагаю, один«Взломать» может означать, что EditText потеряет фокус, когда виртуальная или ручная клавиатура будет скрыта или что-то в этом роде.

Ответы [ 21 ]

0 голосов
/ 05 августа 2014

Для меня это не помогло переопределить ScrollView onTouch. Также не работал android: downndantFocusability = "beforeDescendants" андроид: focusableInTouchMode = "истина" Это и другие упомянутые решения работали только в первый раз - только когда EditText не выбран, но после его выбора прокрутка автоматически прокручивается снова.

Поскольку я уже написал код, позволяющий скрыть клавиатуру при прикосновении к другим представлениям, я просто добавил две строки кода, и он работал как чемпион:

public static void setupUI(final Activity activity, final View view) {
    //view is the parent view in your layout
    OnTouchListener mTouchListener = new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            try {
                View vFocused = null;
                vFocused = activity.getCurrentFocus();

                if (vFocused != null) {
                    hideSoftKeyboard(activity, v);
                    if (vFocused instanceof EditText) {
                        vFocused.clearFocus();//this is the trick to avoid ScrollView autoscroll
                    }
                }
            } catch (Exception e) {
            }
            return false;
        }
    };

    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText) && !(view instanceof ViewGroup)) {
        view.setOnTouchListener(mTouchListener);
    }

    // If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {
        view.setOnTouchListener(mTouchListener);
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupUI(activity, innerView);
        }
    }
}
public static void hideSoftKeyboard(Context context, View v) {
    InputMethodManager inputMethodManager = (InputMethodManager) context
            .getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

также добавил это в режиме просмотра root:

android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"

Возможно, это не очень хорошее решение, но оно работает.

...