gpt4 book ai didi

android - 当当前页面不是第一页时,ViewPager 在旋转屏幕后有错误的偏移数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:55 26 4
gpt4 key购买 nike

应用结构:

我的应用程序有一个 FragmentActivity,并且该 FragmentActivity 托管一个 Fragment,该 Fragment 托管一个 ViewPagerViewPager 有一个适配器,它是 FragmentStatePagerAdapater 的子类,并且该适配器覆盖 getItem() 以根据位置返回一个新的 Fragment; getCount() 设置为始终返回 2。

问题:

在以下两种情况之一发生之前​​,该应用程序可以正常工作:当 ViewPager 显示第二个 fragment 时发生旋转,或者如果在 onResume() 中,ViewPager 被告知滚动到第一页以外的一页。据我所知,这些场景是相同的。当其中一个事件发生时,滚动停止,可见 fragment 是 ViewPager 管理的第二个 fragment ,onPageScrolled(int, float, int) 回调被调用“position”参数仍为“0”(应该为 1),“positionOffset”参数设置为“1”(超出文档中 promise 的 [0,1) 范围)。我在 ViewPager 代码中做了一些探索,发现 boolean pageScrolled(int xpos) 函数被调用的值在 [0,940] 范围内(第一页为 0,然后是 940第二个)到被调用 [-940,0] 范围内的值(第一个是 -940,第二个是 0)。如果 ViewPager 被重置为认为第二页是第一页,那么这实际上是有道理的(某种程度上),尽管这根本不是我想要的。

部分代码:

ViewPagerFragment(托管 ViewPager)。 MyViewPager 只是支持库的 ViewPager 的复制/粘贴;我想从它的私有(private)方法中打印出一些数据。

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(offset),当一页滚动完成时它总是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);
}
}

希望这对您有所帮助。

关于android - 当当前页面不是第一页时,ViewPager 在旋转屏幕后有错误的偏移数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24194740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com