我有一个应用程序,其主要导航功能是一个基本上无限页面的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;
}
}
我一直试图弄清楚这几个小时,我无法到达任何地方。任何帮助将不胜感激!
编辑:样式
答案 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,因为您没有在清单中标记方向。仅当您计划手动处理方向更改时,才应覆盖此方法。
和
在活动被销毁之前调用第一个(更改配置时会发生什么) 在重新创建活动时调用第二个,因此您需要在第一个中传递您需要的参数(即视图寻呼机的当前页面),在第二个中读取它并手动恢复视图/适配器的状态等。