2013-09-06 17 views
7

Próbuję rozwiązać ten problem: How to disable pullToRefreshScrollView from listening to touch Zastanawiam się, czy istnieje rozwiązanie, które blokuje ScrollView w obsłudze onTouchEvents bez tworzenia dla niego dostosowywanej klasy? Dlaczego wszyscy Methos jakJak wyłączyć przewijanie ScrollView?

gridView.getParent().requestDisallowInterceptTouchEvent(true); 

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

nie działa? z czym jest problem? dlaczego Google wdraża metody, które nie działają?

Odpowiedz

18

// Pobierz Scrollview

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

// Wyłącz Przewijanie poprzez utworzenie OnTouchListener zrobić nic

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

// Włącz Przewijanie usuwając OnTouchListner

tvDisplayScroll.setOnTouchListener(null);  
+4

mam wklejony tego rozwiązania, to nie chce działać. –

+0

działa, ale teraz nie mogę przewinąć mojego zagnieżdżonego przewijania albo .. – DrNachtschatten

6

Spróbuj i zobacz:

 scrollView.setOnTouchListener(new View.OnTouchListener() { 

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

Utwórz niestandardowy ScrollView i używaj go w dowolnym miejscu.

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

} 

ten może być użyty w układzie

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

</com.packagename.CustomScrollView > 

Następnie wywołać

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

tak, to działa, ale jak pisałem powyżej, staram się unikać tych rozwiązań. Dzięki i tak –

+2

this.scrollable = przewijane; –

+0

Obie metody nadpisywania można uprościć: 'public boolean onTouchEvent (MotionEvent ev) {return! Scrollable? false: super.onTouchEvent (ev); } 'i to samo z onIntercept ... – Pierre

Powiązane problemy