Android TimePicker (Wheel Style) некорректно реагирует на жесты прокрутки внутри ScrollView

У меня есть диалоговое окно, содержащее Scrollview, которое содержит макет с двумя TimePickers.

Таймпикеры - это более новые стили, которые есть в ICS.

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

Любые идеи? Заранее спасибо.


person int21h    schedule 13.01.2012    source источник


Ответы (2)


У меня была такая же проблема при использовании темы Holo, и вот где я нашел решение: https://groups.google.com/forum/?fromgroups#!topic/android-developers/FkSfJI6dH8w

Вы должны реализовать свой собственный DatePicker или TimePicker и переопределить следующий метод:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    if (ev.getActionMasked() == MotionEvent.ACTION_DOWN)
    {
        ViewParent p = getParent();
        if (p != null)
            p.requestDisallowInterceptTouchEvent(true);
    }

    return false;
}
person Klemens Zleptnig    schedule 13.03.2012
comment
Вы - чемпион, я столько всего пробовал, реализация слушателя на ощупь не работала, но это сработало. - person viv; 27.02.2015
comment
Для всех, кто использует это, не забудьте также определить правильный конструктор: public CustomDatePicker (Context context, AttributeSet attrs) {super (context, attrs);} - person Naijaba; 21.04.2019

Поскольку ссылка от Klemens Zleptnig не работает, вот полный пример. Это исправление также помогает при прокрутке TabLayout. Я исключил область вокруг больших чисел в верхней части TimePicker, потому что им в любом случае не нужно событие прокрутки.

xml:

<com.name.app.MyTimePicker
                android:id="@+id/timePicker"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
.../>

Джава:

public class MyTimePicker extends TimePicker {
    public MyTimePicker(Context context) {
        super(context);
    }

    //This is the important constructor
    public MyTimePicker(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTimePicker(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyTimePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
        //Excluding the top of the view
            if(ev.getY() < getHeight()/3.3F)
                return false;

            ViewParent p = getParent();
            if (p != null)
                p.requestDisallowInterceptTouchEvent(true);
        }

        return false;
    }
}
person einUsername    schedule 18.03.2020