禁用Android ViewPager上的滑动

时间:2014-05-07 07:13:52

标签: android android-fragments android-viewpager

我正在开发一个Android应用程序,其中我使用android视图寻呼机在4个片段之间滑动。在片段之间表现良好。我需要的是我想要禁用滑动,直到第一个片段上的操作完成。如果所有在特定片段滑动时执行的必要操作必须从该片段启用,直到最后一个片段为止。我应该为此做什么?任何人都有建议吗?请记住我需要控制从所有片段中滑动。请帮帮我。谢谢你。

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

其中一个片段

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

2 个答案:

答案 0 :(得分:2)

一种方法是将OnTouchListener设置为ViewPager,就像这样 -

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

答案 1 :(得分:2)

您需要继承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;
    }
}

现在,您可以通过调用setSwipable方法启用/禁用滑动。

UPD:要在XML中编辑此属性,该类将为:

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

你的值/ attr.xml:

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

现在您可以在布局中使用它了:

<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"/>