RequestDisallowInterceptTouchEvent не работает, если сначала не выбрать вид
В соответствии с документами для Android вы можете получить родительскую ViewGroup
и вызвать для requestDisallowInterceptTouchEvent(true)
чтобы не мешать другим вещам. Это приводит к тому, что не только непосредственный родительский объект, но и любые другие родительские объекты, которые могут перехватывать касание, игнорируют его в течение определенного события...
Это звучит замечательно и, кажется, отлично работает на более новых устройствах (у меня это Android 4.1), но на старых устройствах (например, 2.3.3) оно не работает, если я сначала не нажму на свое представление прокрутки, а затем прокручиваю его, в противном случае другие родительские прокручиваемые представления могут все еще вмешиваться.
Я отправляю запрос в View.OnTouchListener
для прокручиваемого потомка.
Любая идея, как заставить это работать автоматически, не прибегая к написанию пользовательских подклассов для проверки прямоугольника попадания в событии движения и т.д.?
Ответы
Ответ 1
У меня были некоторые проблемы с 2.3, где это запрет будет intermittenltly работать.
Я использовал для вызова view.requestDisallowInterceptTouchEvent(true) независимо от event.getAction().
Затем я попытался стать хорошим гражданином и изменил свой код в методе onTouch() на следующее:
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
v.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
v.requestDisallowInterceptTouchEvent(false);
break;
default:
break;
}
Помните, что этот метод (или некоторые другие представления под ссылочным представлением) должен вернуть true, чтобы родители придерживались запроса на запрет.
Не уверен, что это исправит вашу проблему, но стоит попробовать.
Ответ 2
Вы можете попробовать следующее:
m_parentScrollView.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View p_v, MotionEvent p_event)
{
m_childScrollView.getParent().requestDisallowInterceptTouchEvent(false);
// We will have to follow above for all scrollable contents
return false;
}
});
**OR**
m_childScrollView.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View p_v, MotionEvent p_event)
{
// this will disallow the touch request for parent scroll on touch of child view
p_v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});