Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to disable viewpager adapter on touching specific views?

I have a viewpager which switches between tabs when swiping left/right.In my second tab, i have some custom views which have listeners for pinching and dragging but when i try to pinch or drag, the viewpager starts to swipe the page.

A solution comes to my mind is to disable swiping when touching those specific views and only swipe when touching outside those views.Is this possible?

Updated: @Asok kindly provided the solution. But then updated the code which wouldnt work in my case so i post the previous piece of code which worked for me:

public class CustomViewPager extends ViewPager { private boolean swipeable = true;  public CustomViewPager(Context context) {     super(context); }  public CustomViewPager(Context context, AttributeSet attrs) {     super(context, attrs); }  // Call this method in your motion events when you want to disable or enable // It should work as desired. public void setSwipeable(boolean swipeable) {     this.swipeable = swipeable; }  @Override public boolean onInterceptTouchEvent(MotionEvent arg0) {     return (this.swipeable) ? super.onInterceptTouchEvent(arg0) : false; } 

Lets suppose i have a draggable view and i need to disable swipping when dragging start and re enable when dragging finished so in TouchEvent of my so called view:

    @Override public boolean onTouchEvent(MotionEvent event) {     switch(event.getAction()) {     case MotionEvent.ACTION_DOWN: //disable swiping when the button is touched ((ActivityOriginal) getActivity()).setSwipeable(false); //the rest of the code...         break;     case MotionEvent.ACTION_MOVE:          break;     case MotionEvent.ACTION_UP: //re enable swipping when the touch is stopped //the rest of the code... ((ActivityOriginal) getActivity()).setSwipeable(true);         break;     }     return true; } 
like image 836
Mehdi Fanai Avatar asked May 02 '13 16:05

Mehdi Fanai


People also ask

How do I stop ViewPager swiping?

To enable / disable the swiping, just overide two methods: onTouchEvent and onInterceptTouchEvent . Both will return "false" if the paging was disabled. You just need to call the setPagingEnabled method with false and users won't be able to swipe to paginate.

Is ViewPager deprecated?

Technically, ViewPager is not deprecated, but the two concrete PagerAdapter implementations — FragmentPagerAdapter and FragmentStatePagerAdapter — are deprecated.

How do I set ViewPager to TabLayout?

Android ViewPager ViewPager with TabLayout A TabLayout can be used for easier navigation. You can set the tabs for each fragment in your adapter by using TabLayout. newTab() method but there is another more convenient and easier method for this task which is TabLayout. setupWithViewPager() .


1 Answers

This first thing that comes to mind for me is to have a custom ViewPager in which, when your touch listeners get notified of a specific event you could set the swipeable boolean in ViewPager to false and set it back to true whichever way best fits your application.

public class CustomViewPager extends ViewPager {     private boolean swipeable = true;      public CustomViewPager(Context context) {         super(context);     }      public CustomViewPager(Context context, AttributeSet attrs) {         super(context, attrs);     }      // Call this method in your motion events when you want to disable or enable     // It should work as desired.     public void setSwipeable(boolean swipeable) {         this.swipeable = swipeable;     }      @Override     public boolean onInterceptTouchEvent(MotionEvent arg0) {         return (this.swipeable) ? super.onInterceptTouchEvent(arg0) : false;      }  } 

Make sure to change your layout file to show:

<com.your.package.CustomViewPager .. /> 

Instead of:

<android.support.v4.view.ViewPager .. /> 

Edit 2

Here is my setup (Working with the above CustomViewPager):

CustomViewPager mViewPager;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);      // Set up the action bar.     final ActionBar actionBar = getActionBar();     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);      // Create the adapter that will return a fragment for each of the three     // primary sections of the app.     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());      // Set up the CustomViewPager with the sections adapter.     mViewPager = (CustomViewPager) findViewById(R.id.pager);     mViewPager.setAdapter(mSectionsPagerAdapter);     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {         @Override         public void onPageSelected(int position) {             actionBar.setSelectedNavigationItem(position);         }     });      // For each of the sections in the app, add a tab to the action bar.     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {         actionBar.addTab(actionBar.newTab()                 .setText(mSectionsPagerAdapter.getPageTitle(i))                 .setTabListener(this));     }  }  public void swipeOn(View v) {     mViewPager.setSwipeable(true); }  public void swipeOff(View v) {     mViewPager.setSwipeable(false); } 

The above shown onCreate is in my MainActivity class which extends FragmentActivity and implements ActionBar.TabListener

like image 136
jnthnjns Avatar answered Sep 21 '22 06:09

jnthnjns