当当前页面不是第一页时,ViewPager在旋转屏幕后有错误的偏移数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当当前页面不是第一页时,ViewPager在旋转屏幕后有错误的偏移数据相关的知识,希望对你有一定的参考价值。
应用结构:
我的应用程序有一个FragmentActivity
,并且FragmentActivity
拥有一个Fragment
,其中包含ViewPager
。 ViewPager
有一个子类FragmentStatePagerAdapater
的适配器,该适配器覆盖getItem()
以根据位置返回一个新的Fragment; getCount()
总是返回2。
问题:
应用程序工作正常,直到两件事情发生:当ViewPager显示第二个片段时发生旋转,或者如果在onResume()
中,ViewPager被告知滚动到第一个片段之外的页面。据我所知,这些情况是相同的。当其中一个事件发生时,滚动停止,可见片段是由ViewPager管理的第二个片段,调用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上似乎有一个错误。
我计算当前页面的scrollX(偏移量),当一页滚动完成时总是0。
但是,旋转后,它会达到1或X(页面宽度大约为938~9,如果页面宽度为940)。
当设备旋转时,我在onPageScrolled
上遇到了一些问题,我通过在setAdapter
等旋转回调上再次调用onConfigurationChanged
解决了这些问题。
这是一些代码块。 Device
是我的定制课程。
public void configOnOrientationChange() {
if (Device.isPortrait(getContext())) {
configOnPortraitOrientation();
} else if (Device.isLandscape(getContext())) {
configOnLandscapeOrientation();
}
int currentItem = mViewPager.getCurrentItem();
if (mPagerAdapter != null) {
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setCurrentItem(currentItem);
}
}
希望这可以帮助。
像这样覆盖ViewPager的onSizeChanged方法:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
beginFakeDrag();
fakeDragBy(0);
endFakeDrag();
}
以上是关于当当前页面不是第一页时,ViewPager在旋转屏幕后有错误的偏移数据的主要内容,如果未能解决你的问题,请参考以下文章
PHP中模糊查询后实现分页时,只显示第一页信息,之后的页面信息不显示,求类似问题解决方法最好有代码,谢
vue框架,使用pagination组件进行分页时 分页不在第一页的时候保存了 筛选记录,然后f5刷新又到第一页了,到了onCurrentChange改变分页的函数改变了