现在的位置: 首页 > 综合 > 正文

Android 技术总结:(二)SlidingMenu与ViewPager双向滑动的解决方案

2013年01月24日 ⁄ 综合 ⁄ 共 3314字 ⁄ 字号 评论关闭

最近研究SlidingMenu开源库,发现它里面有一个ViewPagerActivity的例子。但在这个例子中,ViewPager只支持单向滑动。稍作一点修改,即可实现双向滑动。

  • 原始的ViewPagerActivity.java代码。
public class ViewPagerActivity extends BaseActivity {

    public ViewPagerActivity() {
        super(R.string.viewpager);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ViewPager vp = new ViewPager(this);
        vp.setId("VP".hashCode());
        vp.setAdapter(new ColorPagerAdapter(getSupportFragmentManager()));
        setContentView(vp);

        vp.setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageSelected(int position) {
                switch (position) {
                case 0:
                    getSlidingMenu().setTouchModeAbove(
                            SlidingMenu.TOUCHMODE_FULLSCREEN);
                    break;
                default:
                    getSlidingMenu().setTouchModeAbove(
                            SlidingMenu.TOUCHMODE_MARGIN);
                    break;
                }
            }

        });

        vp.setCurrentItem(0);
        getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
    }

    public class ColorPagerAdapter extends FragmentPagerAdapter {

        private ArrayList<Fragment> mFragments;

        private final int[] COLORS = new int[] { R.color.red, R.color.green,
                R.color.blue, R.color.white, R.color.black };

        public ColorPagerAdapter(FragmentManager fm) {
            super(fm);
            mFragments = new ArrayList<Fragment>();
            for (int color : COLORS)
                mFragments.add(new ColorFragment(color));
        }

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

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

    }

}

  • 改动后的ViewPagerActivity.java代码。
public class ViewPagerActivity extends BaseActivity {
 
    public ViewPagerActivity() {
        super(R.string.viewpager);
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSlidingMenu().setSecondaryMenu(R.layout.menu_frame_two);
        getSlidingMenu().setSecondaryShadowDrawable(R.drawable.shadowright);
        getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame_two, new SampleListFragment()).commit();
 
        ViewPager vp = new ViewPager(this);
        vp.setId("VP".hashCode());
        final ColorPagerAdapter cpa = new ColorPagerAdapter(getSupportFragmentManager());
        vp.setAdapter(cpa);
        setContentView(vp);
        vp.setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
 
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }
 
            @Override
            public void onPageSelected(int position) {
                int lastPostion = cpa.getCount() - 1;
                //请看这里
                if (position == 0) {
                    getSlidingMenu().setMode(SlidingMenu.LEFT); // 第一个。SlidingMenu仅有左边有效
                    getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
                } else if (position == lastPostion) {
                    getSlidingMenu().setMode(SlidingMenu.RIGHT); // 最后一个。SlidingMenu仅有右边有效
                    getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
                } else {
                    getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); // 中间,SlidingMenu无效
                }
            }
        });
 
        vp.setCurrentItem(0);
        getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        getSlidingMenu().setMode(SlidingMenu.LEFT);
    }
 
    public class ColorPagerAdapter extends FragmentPagerAdapter {
 
        private ArrayList<Fragment> mFragments;
 
        private final int[] COLORS = new int[] { R.color.red, R.color.green, R.color.blue, R.color.white, R.color.black };
 
        public ColorPagerAdapter(FragmentManager fm) {
            super(fm);
            mFragments = new ArrayList<Fragment>();
            for (int color : COLORS)
                mFragments.add(new ColorFragment(color));
        }
 
        @Override
        public int getCount() {
            return mFragments.size();
        }
 
        @Override
        public Fragment getItem(int position) {
            return mFragments.get(position);
        }
 
    }
 
}

抱歉!评论已关闭.