androidandroid-scrollviewhorizontalscrollview

How to disable HorizontalScrollView


I'm programming a custom ChipGroup class and in the layout I have a HorizontalScrollView and a Material ChipGroup inside. In my constructor I pass a boolean called "isScrollable" because I want it to be configurable the scrolling.

Is there a way to inactivate the scroll of the HorizontalScrollView if scrolling is configured as false?


Solution

    1. You cannot disable the scrolling of a ScrollView. You would need to extend to ScrollView and override the onTouchEvent method to return false when some condition is matched.
    2. The Gallery component scrolls horizontally regardless of whether it is in a ScrollView or not - a ScrollView provides only vertical scrolling (you need a HorizontalScrollView for horizontal scrolling).
    3. You seem to say you have a problem with the image stretching itself -- this has nothing to do with the ScrollView, you can change how an ImageView scales with the android:scaleType property (XML) or the setScaleType method for instance ScaleType.CENTER will not stretch your image and will center it at it's original size.

    You could modify ScrollView as follows to disable scrolling:

      class LockableScrollView extends ScrollView {   
    
        // true if we can scroll (not locked)
        // false if we cannot scroll (locked)
        private boolean mScrollable = true;
    
        public void setScrollingEnabled(boolean enabled) {
            mScrollable = enabled;
        }
    
        public boolean isScrollable() {
            return mScrollable;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    // if we can scroll pass the event to the superclass
                    return mScrollable && super.onTouchEvent(ev);
                default:
                    return super.onTouchEvent(ev);
            }
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            // Don't do anything with intercepted touch events if
            // we are not scrollable
            return mScrollable && super.onInterceptTouchEvent(ev);
        }
    
    }
    

    then,

     <com.mypackagename.LockableScrollView 
            android:id="@+id/QuranGalleryScrollView" 
            android:layout_height="fill_parent" 
            android:layout_width="fill_parent">
        
            <Gallery android:id="@+id/Gallery" 
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent"
                android:scrollbars="horizontal">
            </Gallery>
        
        </com.mypackagename.LockableScrollView>
    

    in your XML file (just changed the ScrollView to your special LockableScrollView).

    Then call

    ((LockableScrollView)findViewById(R.id.QuranGalleryScrollView)).setScrollingEnabled(false);
    

    to disable scrolling of the view.