2013-09-06 5 views
7

Попытка решить эту проблему: How to disable pullToRefreshScrollView from listening to touch Мне интересно, есть ли решение, чтобы блокировать ScrollView от обработки onTouchEvents, не создавая для него настраиваемый класс? Почему все Митос какКак отключить прокрутку ScrollView?

gridView.getParent().requestDisallowInterceptTouchEvent(true); 

mScrollView.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return false; 
      } 
     }); 

не работает? в чем проблема с ними? почему Google реализует методы, которые не работают?

ответ

18

// Получить Scrollview

final ScrollView myScroll = (ScrollView) findViewById(R.id.display_scrollview); 

// Отключить Scrolling путем создания OnTouchListener не делать ничего

myScroll.setOnTouchListener(new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return true; 
    } 
}); 

// Включить прокрутку удалением OnTouchListner

tvDisplayScroll.setOnTouchListener(null);  
+4

Я вставил это решение, он не хочет работать. –

+0

работает, но теперь я не могу прокрутить свое вложенное прокрутки. – DrNachtschatten

6

Посмотрите:

 scrollView.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      return isBlockedScrollView; 
     } 
    }); 
8

Создайте собственный ScrollView и используйте его везде, где хотите.

class CustomScrollView extends ScrollView { 

    // true if we can scroll the ScrollView 
    // false if we cannot scroll 
    private boolean scrollable = true; 

    public void setScrollingEnabled(boolean scrollable) { 
     this.scrollable = scrollable; 
    } 

    public boolean isScrollable() { 
     return scrollable; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       // if we can scroll pass the event to the superclass 
       if (scrollable) return super.onTouchEvent(ev); 
       // only continue to handle the touch event if scrolling enabled 
       return scrollable; // scrollable is always false at this point 
      default: 
       return super.onTouchEvent(ev); 
     } 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     // Don't do anything with intercepted touch events if 
     // we are not scrollable 
     if (!scrollable) return false; 
     else return super.onInterceptTouchEvent(ev); 
    } 

} 

Это можно использовать в макете

<com.packagename.CustomScrollView 
    android:id="@+id/scrollView" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"> 

</com.packagename.CustomScrollView > 

Затем вызовите

((CustomScrollView)findViewById(R.id.scrollView)).setIsScrollable(false); 
+0

да, это работает, но, как я набрал выше, я стараюсь избегать этих решений. Спасибо в любом случае –

+2

this.scrollable = прокручиваемый; –

+0

Два метода переопределения могут быть упрощены: 'public boolean onTouchEvent (MotionEvent ev) {return! Scrollable? false: super.onTouchEvent (ev); } 'и то же самое с onIntercept ... – Pierre

Смежные вопросы