应用程序结构:
我的应用程序只有一个FragmentActivity
,该FragmentActivity
托管一个Fragment
,该Fragment
又托管一个ViewPager
。 ViewPager
具有一个适配器,该适配器是FragmentStatePagerAdapater
的子类,并覆盖了getItem()
以根据位置返回一个新的Fragment; getCount()
设置为始终返回2。
问题:
应用程序在以下两种情况下工作得很好:当ViewPager显示第二个Fragment时发生旋转,或者在onResume()
中告诉ViewPager滚动到第一页以外的页面。就我所知,这些情况是相同的。当发生其中一种事件时,滚动已停止,并且被ViewPager管理的Fragment中可见的Fragment是第二个Fragment。此时,回调函数onPageScrolled(int, float, int)
的'position'参数仍为0(应为1),而'positionOffset'参数设置为1(这超出了文档中承诺的[0,1)范围)。我在ViewPager代码中进行了一些探索,发现boolean pageScrolled(int xpos)
函数从使用[0,940]范围内的值(第一页为0,第二页为940)调用到使用[-940,0]范围内的值(第一个为-940,在第二个上为0)。如果ViewPager被重置以认为第二个页面是第一页,则这实际上是有意义的(有点),尽管这不是我想要的。
一些代码:
ViewPagerFragment(托管ViewPager)。MyViewPager只是支持库ViewPager的复制/粘贴;我想打印一些来自其私有方法的数据。
public class ViewPagerFragment extends Fragment implements MyViewPager.OnPageChangeListener{
@InjectView(R.id.view_pager) MyViewPager viewPager;
@DebugLog
public ViewPagerFragment() {
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_pager, container, false);
ButterKnife.inject(this,view);
Log.d("onCreateView()","ViewPagerFragment = "+this.toString());
return view;
}
@Override
public void onResume() {
super.onResume();
setupPager();
}
void setupPager(){
if(viewPager != null) {
if (viewPager.getAdapter() == null) {
viewPager.setAdapter(new MyFragmentAdapter(getChildFragmentManager()));
}
viewPager.setOnPageChangeListener(this);
viewPager.setPageMargin(40);
}
}
@Override
@DebugLog
public void onDestroyView() {
super.onDestroyView();
viewPager.setOnPageChangeListener(null);
ButterKnife.reset(this);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(positionOffset == 1f){
Log.d("onPageScrolled","position offset == 1 and position == "+position+". That's bad!");
} else if(position == 1){
Log.d("onPageScrolled","position offset == "+positionOffset+" and position == 1. That's good!");
}
}
public static class MyFragmentAdapter extends FragmentStatePagerAdapter{
public MyFragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
@DebugLog
public Fragment getItem(int position) {
return PageFragment.newInstance(position);
}
@Override
public int getCount() {
return 2;
}
}
我的问题是:“我做错了什么导致ViewPager出了问题,我该如何解决?”如果移除
setRetainInstance()
调用,那么显然会重置一切,但我也会失去在ViewPager中的位置。移除setRetainInstance()
调用,然后使用Bundle savedInstanceState
来保存ViewPager的位置也无法解决问题(正如我在帖子开头提到的)。谢谢!
viewPager.setPageMargin(40);
? - Ultimo_m