Viewpager +配置更改=关闭中心当前项目

时间:2014-01-22 22:25:15

标签: android android-viewpager android-orientation

我有一个应用程序,其主要导航功能是一个基本上无限页面的ViewPager。我正在使用与InfiniteViewPager类似的东西(带有FragmentStatePagerAdapter),在ViewPager的中间开始导航,因此左侧和右侧都有页面开始。我也使用负边距mPager.setPageMargin(-50);使两边的页面略微可见。

我正在从网上加载大量数据,因此我在自己的活动中使用android:configChanges="orientation|keyboardHidden"onConfigurationChanged覆盖来自行处理配置更改。主要是,我不想重新创建我的活动,因为我认为在改变方向时需要花费太长时间。

问题

我打开应用程序,向任一方向滑动,等待ViewPager停止动画,然后更改方向。当前页面现在稍微偏离中心,一个相邻页面比另一个更暴露。有时其中一个相邻页面完全在屏幕外。

如果我触摸该页面,ViewPager会滚动到当前页面并按预期显示,但除非我这样做,否则显示错误。我遇到这个问题从风景到肖像,从肖像到风景。我已尝试设置OnGlobalLayoutListener并执行mViewPager.setCurrentItem(mViewPager.getCurrentItem())ViewPager忽略setCurrentItem如果您要求将当前项目设置为实际当前项目。

代码

MainActivity

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //whatever I do in here doesn't make a difference.
    //my viewpager still displays off center, even if I do nothing custom
}

寻呼机适配器

private class MyAdapter extends FragmentStatePagerAdapter{

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

    @Override
    public Fragment getItem(int position) {
        PageData dataForThisPage = mModel.getDataForPage(position);
        PageContainerFragment f = PageContainerFragment.create(position, dataForThisPage);

        return f;
    }

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

我一直试图弄清楚这几个小时,我无法到达任何地方。任何帮助将不胜感激!

编辑:样式

2 个答案:

答案 0 :(得分:8)

我在这里找到了问题的答案:https://code.google.com/p/android/issues/detail?id=39287。大小更改不能很好地与具有非零边距的ViewPager一起使用,因此解决方法是扩展ViewPager并添加以下覆盖方法。

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w-this.getPageMargin(), h, oldw-this.getPageMargin(), oldh);
}

答案 1 :(得分:0)

更改方向时未调用

onConfigurationChanged,因为您没有在清单中标记方向。仅当您计划手动处理方向更改时,才应覆盖此方法。

你应该看的方法是: http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)

http://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState(android.os.Bundle)

在活动被销毁之前调用第一个(更改配置时会发生什么) 在重新创建活动时调用第二个,因此您需要在第一个中传递您需要的参数(即视图寻呼机的当前页面),在第二个中读取它并手动恢复视图/适配器的状态等。