2013-09-06 17 views
7

Cố gắng giải quyết vấn đề này: How to disable pullToRefreshScrollView from listening to touch Tôi tự hỏi nó có một giải pháp, để chặn ScrollView khỏi xử lý onTouchEvents mà không tạo lớp tùy chỉnh cho nó? Tại sao tất cả các methos nhưLàm cách nào để vô hiệu hóa cuộn ScrollView?

gridView.getParent().requestDisallowInterceptTouchEvent(true); 

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

không hoạt động? vấn đề với họ là gì? tại sao Google triển khai các phương pháp không hoạt động?

Trả lời

18

// Lấy scrollview

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

// Disable cuộn bằng cách thiết lập một OnTouchListener để làm gì

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

// Enable cuộn bằng cách loại bỏ các OnTouchListner

tvDisplayScroll.setOnTouchListener(null);  
+4

Tôi đã dán giải pháp này, nó không muốn làm việc. –

+0

hoạt động, nhưng bây giờ tôi không thể cuộn scrollview lồng nhau của tôi hoặc .. – DrNachtschatten

6

Hãy thử xem:

 scrollView.setOnTouchListener(new View.OnTouchListener() { 

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

Tạo một ScrollView tùy chỉnh và sử dụng nó bất cứ nơi nào bạn muốn.

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

} 

Điều này có thể được sử dụng trong cách bố trí

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

</com.packagename.CustomScrollView > 

Sau đó gọi

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

có, điều này hoạt động, nhưng khi tôi gõ ở trên tôi đang cố gắng để tránh các giải pháp này. Thanks anyway –

+2

this.scrollable = scrollable; –

+0

Hai phương thức ghi đè có thể được đơn giản hóa: 'public boolean onTouchEvent (MotionEvent ev) {return! Scrollable? false: super.onTouchEvent (ev); } 'và giống với onIntercept ... – Pierre