SlidingMenu 与 ViewPager 冲突

SlidingMenu with ViewPager conflict

我正在尝试让 SlidingMenuViewPager 一起工作,并且我已经严格按照库中的示例进行操作。我的 Activity 的来源可以在下面找到。

问题是,尽管 SlidingMenuViewPager 可以很好地协同工作,但在第一次打开 SlidingMenu 并随后关闭它之后,出现了这个问题ViewPager 开始表现怪异。

奇怪的是,当您向右和向左滑动时,UI 卡在一页上并且没有改变,我的意思是它只是我在记录器中看到的 UI页面实际上发生了变化。

我在网上进行了广泛的搜索,虽然在实施 SlidingMenuViewPager 时出现了很多类似的问题,但我的问题似乎是独一无二的。

感谢任何帮助。

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

    }

}

最后我设法解决了它。它与 SlidingMenu class 中的 manageLayers 方法有关。 只需注释掉方法体即可:

    @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);
                    }
                }
            });
        }*/
    }