Search code examples
androidwebviewscrollandroid-viewpager

Scroll Webview in Viewpager


I have a WebView in a ViewPager. And the ViewPager seems to consume all the horizontal scrolling, so that I can't scroll in the WebView (vertical works).

How can I achieve that the WebView has got priority consuming the horizontal scrolling?


Solution

  • don't ask me why this code gets formatted like this,

    1. implement a custom ViewPager Instance like this:

    import android.content.Context;
    import android.support.v4.view.ViewPager;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    
    public class CustomViewPager extends ViewPager {
    
        private MagazineWebView_WithoutFlipWebView mCurrentPageWebView_; //custom webview
    
        public CustomViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
    
            if (Constants.LOGGING) {
                Log.v(Constants.LOG_OEAMTC_APP, "CustomViewPager - onInterceptTouchEvent");
            }
    
            // if view zoomed out (view starts at 33.12... scale level) ... allow
            // zoom within webview, otherwise disallow (allow viewpager to change
            // view)
            if (mCurrentPageWebView_ != null && (mCurrentPageWebView_.getScale() * 100) > 34) {
                Log.v(Constants.LOG_OEAMTC_APP, "CustomViewPager - intrcepted: " + String.valueOf((mCurrentPageWebView_.getScale() * > 100)));
                this.requestDisallowInterceptTouchEvent(true);
            }
            else {
                if (mCurrentPageWebView_ != null) {
                    Log.v(Constants.LOG_OEAMTC_APP,
                            "CustomViewPager - not intrcepted: " + String.valueOf(mCurrentPageWebView_.getScale() * 100));
                }
                this.requestDisallowInterceptTouchEvent(false);
            }
    
            return super.onInterceptTouchEvent(event);
        }
    
        public MagazineWebView_WithoutFlipWebView getCurrentPageWebView() {
            return mCurrentPageWebView_;
        }
    
        public void setCurrentPageWebView(MagazineWebView_WithoutFlipWebView currentPageWebView) {
            mCurrentPageWebView_ = currentPageWebView;
        }
    }
    

    2. in your main (ViewPager) Activity add the following lines to the view pager

    mViewPager_ = new AwesomePagerAdapter();
    viewpapgerInLayout = (CustomViewPager) findViewById(R.id.awesomepager);
    viewpapgerInLayout.setAdapter(mViewPager_);
    viewpapgerInLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            viewpapgerInLayout.setCurrentPageWebView(mLstPagesWebviews_.get(position));
        }
        
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        
        }
        
        @Override
        public void onPageScrollStateChanged(int state) {
        
        }
    });
    

    3. finally, run it :=) if the zoom level is at initial zoom, changes pages is allowed, all the other time you can navigate your web view

    Ps.: Don't forget to change your ViewPager in your *.xml file with the CustomViewPager Class you just created

    good luck :)