简体   繁体   中英

SlidingMenu with ViewPager conflict

I'm trying to get SlidingMenu to work alongside ViewPager and I have followed the examples inside the library to the letter. The source for my Activity can be found bellow.

The problem is that despite the fact that the SlidingMenu and ViewPager work fine together there is this problem that after opening the SlidingMenu for the first time and closing it afterwards the ViewPager starts acting weird.

By weird I mean when you swipe to right and left the UI gets stuck on one page and doesn't change and I mean it's only the UI as I can see in the logger that the pages actually change.

I have searched the web extensively and although there has been a lot of similar problems with implementing SlidingMenu alongside ViewPager , my problem seems to be unique.

Any help is appreciated.

public class MainTabActivity extends SlidingFragmentActivity {
    private static final String TAG = "MainTabActivity";

    @InjectView(R.id.tabHostPager)
    ViewPager tabHostPager;
    @InjectView(R.id.tabs)
    PagerSlidingTabStrip tabStrip;

    FragmentPagerAdapter pagerAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_tab);
        setBehindContentView(R.layout.sliding_menu_layout);
        loadSlidingMenu();
        ButterKnife.inject(this);

        pagerAdapter = new MainTabAdapter(getSupportFragmentManager());
        tabHostPager.setAdapter(pagerAdapter);

        //Assign the TabStrip it's ViewPager
        tabStrip.setViewPager(tabHostPager);

        tabStrip.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

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

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        tabHostPager.setCurrentItem(0);
    }

    private void loadSlidingMenu() {
        // configure the SlidingMenu
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width = size.x;
        getSlidingMenu().setMode(SlidingMenu.LEFT);
        getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        getSlidingMenu().setShadowWidth(100);
        getSlidingMenu().setFadeDegree(0.35f);
        getSlidingMenu().setBehindWidth(width / 100 * 90);
    }

    private class MainTabAdapter extends FragmentPagerAdapter {

        public MainTabAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public Fragment getItem(int position) {
            return Friends.newInstance();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "Home";
        }

    }

}

Finally I managed to solve it. It had something to with manageLayers method from the SlidingMenu class. Commenting out the method body was all it took:

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void manageLayers(float percentOpen) {
        /*if (Build.VERSION.SDK_INT < 11) return;

        boolean layer = percentOpen > 0.0f && percentOpen < 1.0f;
        final int layerType = layer ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE;

        if (layerType != getContent().getLayerType()) {
            getHandler().post(new Runnable() {
                public void run() {
                    Log.v(TAG, "changing layerType. hardware? " + (layerType == View.LAYER_TYPE_HARDWARE));
                    getContent().setLayerType(layerType, null);
                    getMenu().setLayerType(layerType, null);
                    if (getSecondaryMenu() != null) {
                        getSecondaryMenu().setLayerType(layerType, null);
                    }
                }
            });
        }*/
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM