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;
}
}