Подтвердить что ты не робот

RequestDisallowInterceptTouchEvent не работает, если сначала не выбрать вид

В соответствии с документами для Android вы можете получить родительскую ViewGroup и вызвать для requestDisallowInterceptTouchEvent(true) чтобы не мешать другим вещам. Это приводит к тому, что не только непосредственный родительский объект, но и любые другие родительские объекты, которые могут перехватывать касание, игнорируют его в течение определенного события...

Это звучит замечательно и, кажется, отлично работает на более новых устройствах (у меня это Android 4.1), но на старых устройствах (например, 2.3.3) оно не работает, если я сначала не нажму на свое представление прокрутки, а затем прокручиваю его, в противном случае другие родительские прокручиваемые представления могут все еще вмешиваться.

Я отправляю запрос в View.OnTouchListener для прокручиваемого потомка.

Любая идея, как заставить это работать автоматически, не прибегая к написанию пользовательских подклассов для проверки прямоугольника попадания в событии движения и т.д.?

4b9b3361

Ответ 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;
       }
});