Android TimePicker (стиль колеса) не отвечает правильно на жесты щелчка в ScrollView

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

Timepickers являются более новыми стилями, что в ICS.

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

Есть идеи? Заранее спасибо.

1 ответ

Решение

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

Вы должны реализовать свой собственный 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;
}

Поскольку ссылка от 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;
    }
}
Другие вопросы по тегам