Noufal
Noufal

Reputation: 447

Disabling swiping on the Android ViewPager

I am developing an android application in which i used android view pager for swipe between 4 fragments.swiping between the fragments performing well.what i need is i want to disable the swipe until operations on the first fragment completed.if all the necessary operations performed at the particular fragment swiping has to enable from that fragment and so on until the last fragment.what should i do for this.can any one have the suggetions?.please remember that i need to control the swiping from all fragments.please help me out.thanks in advance..

public class MyPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragments = new ArrayList<Fragment>();
        fragments.add(new SalesTransactionFragment());
        fragments.add(new FragmentCollection());

    //  fragments.add(new FragmentBlue());
        fragments.add(new FragmentGreen());
        fragments.add(new FragmentPink());

    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }
}

MainActivity

 public class MainActivity extends FragmentActivity {


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            MyPagerAdapter pageAdapter = new MyPagerAdapter(getSupportFragmentManager());
            ViewPager pager = (ViewPager)findViewById(R.id.myViewPager);
            pager.setOffscreenPageLimit(4);

            pager.setAdapter(pageAdapter);
        }

One of the Fragment

public class FragmentPink extends Fragment {
Button b;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_pink, container, false);
        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        b=(Button) getActivity().findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
Intent i = new Intent(getActivity(),MainActivity.class);
startActivity(i);
            }
        });
    }
}

Upvotes: 1

Views: 1264

Answers (2)

erakitin
erakitin

Reputation: 11547

You need to subclass ViewPager

public class MyViewPager extends ViewPager {

    private boolean mSwipable = true;

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mSwipable ? super.onInterceptTouchEvent(event) : false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mSwipable ? super.onTouchEvent(event) : false;
    }

    public boolean isSwipable() {
        return mSwipable;
    }

    public void setSwipable(boolean swipable) {
        mSwipable = swipable;
    }
}

Now you can enable/disable swipes by calling setSwipable method.

UPD: To edit this property in XML the class will be:

public class MyViewPager extends ViewPager {

    private boolean mSwipable = true;

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
        try {
            mSwipable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
        } finally {
            a.recycle();
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mSwipable ? super.onInterceptTouchEvent(event) : false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mSwipable ? super.onTouchEvent(event) : false;
    }

    public boolean isSwipable() {
        return mSwipable;
    }

    public void setSwipable(boolean swipable) {
        mSwipable = swipable;
    }
}

And your values/attr.xml:

<declare-styleable name="MyViewPager">
    <attr name="swipeable" format="boolean" />
</declare-styleable>

Now you can use it in your layout:

<my.package.name.MyViewPager
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:swipeable="false"/>

Upvotes: 2

jaibatrik
jaibatrik

Reputation: 7543

One approach would be to set OnTouchListener to the ViewPager like this -

mPager.setOnTouchListener(new OnTouchListener() {           
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(mPaginEnabled)
            return false;
        else 
            return true;
    }
});

Upvotes: 2

Related Questions