Горизонтальная прокрутка внутри другой горизонтальной прокрутки

Я разрабатываю пользовательский интерфейс в Android, где у меня есть HorizontalScrollView внутри другого HorizontalScrollView. Однако ребенок HorizontalScrollView не работает.

Можно ли отключить родительский элемент HorizontalScrollView всякий раз, когда в дочернем элементе HorizontalScrollView делается жест. Я знаю, это звучит сложно, но мне нужно реализовать это в моем пользовательском интерфейсе.


person Gaurav Arora    schedule 30.10.2012    source источник
comment
Я думаю, что это еще не возможно. Я надеюсь, что вы найдете новое решение...   -  person Niranj Patel    schedule 30.10.2012
comment
проверьте это решение: stackoverflow.com/a/7174396/779408 оно предназначено для вертикали. Но я думаю, что вы можете настроить его.   -  person Bobs    schedule 30.10.2012


Ответы (3)


Иметь вещь, которая прокручивается внутри другой вещи, которая прокручивается, как правило, плохая идея. Гугл не рекомендует.

Это связано с тем, как Android обрабатывает события прокрутки. Существует метод с именами dispatchTouchEvent() и onInterceptTouchEvent(), который решает, следует ли перехватывать событие касания или передавать его своим дочерним элементам. Для прокручиваемых представлений они всегда будут перехватывать движения «пролистывания». Так что это никогда не достанется вашим детям.

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

Вот некоторые потенциальные обходные пути, обсуждаемые в этих темах, если вы настаиваете на попытке:

ListView в возможном обходном пути ScrollView

ListView внутри ScrollView не прокручивается на Android

Android: прокручиваемое окно настроек с настраиваемым представлением списка

person Anup Cowkur    schedule 30.10.2012

Как насчет переопределения onInterceptTouchEvent следующим образом:

public class EmbeddedHorizontalScrollView extends HorizontalScrollView {

    public EmbeddedHorizontalScrollView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // tell parent and it's ancestors to skip touch events
                this.getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_UP:
                this.getParent().requestDisallowInterceptTouchEvent(false);
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }
}
person linakis    schedule 30.10.2012

Поэтому я использовал ScrollView внутри LinearLayout внутри horisontalScrollView. Основная проблема заключалась в реализации OnInterceptTouchEvent в HorizontalScrollView для передачи TouchEvent в дочерние ScrollView при обнаружении Y swype. И это работает хорошо и выглядит интересно. Да, вы не должны напрямую размещать Scrollview или listView в другом Scrollview, но вы можете поместить Linearlayout в ScrollView, а затем поместить на него другие прокручиваемые объекты.

person Vitaly    schedule 13.11.2012