为了账号安全,请及时绑定邮箱和手机立即绑定

屏幕方向改变后,tab的title定位不正确,怎么破?

讲得挺好,学到挺多的,就是有俩问题:一个是当滑动到最后一个时,应不进入ViewPagerIndicator滑动,不然会造成最后留有一个tab宽度的空余;还有一个问题就是在处于显示区域外的item时,即我们tab有10,设置可显示为3个,当三角形处于大于第三个的地方,如第六个时,调转屏幕方向,发现ViewPagerIndicator的title会从第一个显示起,而不会直接定位到三角形指示的title,但ViewPager定位页面是正确的。怎么破?

正在回答

5 回答

对于第一个问题,可以让三角形滑动到最后一个tab再执行scrollTo()方法,在原有代码scroll
()方法上修改为:

   public void scroll(int position, float positionOffset) {
   int tabWidth = getWidth() / mTabVisibleCount;
   mTranslationX = (int) (tabWidth * (positionOffset + position));
   //容器移动,当tab处于移动至最后一个时
   if (position >= (mTabVisibleCount - 1) && positionOffset > 0 && getChildCount() > mTabVisibleCount) {
       if (mTabVisibleCount != 1) {
           this.scrollTo(((position - (mTabVisibleCount - 1)) * tabWidth + (int) (tabWidth * positionOffset)), 0);
       } else {
           this.scrollTo((int) (position * tabWidth + tabWidth * positionOffset), 0);
       }
   }
   invalidate();
}

修改代码后效果如下:

http://img1.sycdn.imooc.com//570fcf08000101ab04160637.jpg

对于第二个问题,涉及到View状态的存储与恢复,可参考Android-五子连珠课程,

附上代码如下:

在原有代码上增加属性:

private int myPosition;//用来记录当前选择的position
private static final String INSTANCE = "instance";
private static final String MYPOSITION = "myPosition";
private static boolean isSave = false;//是否切屏的标识

1.在原有代码上增加

..................

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                                      @Override
                                      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                                          myPosition = position;//只增加这一句,保存当前的position
                                          scroll(position, positionOffset);

                                }

................

2.重写onSaveInstanceState()方法和onRestoreInstanceState(Parcelable state)方法(直接复制即可):

@Override
protected Parcelable onSaveInstanceState() {
   Bundle bundle = new Bundle();
   bundle.putParcelable(INSTANCE, super.onSaveInstanceState());
   bundle.putInt(MYPOSITION, myPosition);
   isSave = true;
   return bundle;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
   if (state instanceof Bundle) {
       Bundle bundle = (Bundle) state;
       myPosition = bundle.getInt(MYPOSITION);
       super.onRestoreInstanceState(bundle.getParcelable(INSTANCE));
       return;
   }
   super.onRestoreInstanceState(state);
}

3.重写onDraw(Canvas canvas)方法(直接复制即可):

@Override
protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   if (isSave) {
       int tabWidth = getWidth() / mTabVisibleCount;
       if (myPosition >= mTabVisibleCount)
           this.scrollTo((myPosition - mTabVisibleCount + 1) * tabWidth, 0);
       isSave = false;
   }
}

运行效果如下:

http://img1.sycdn.imooc.com//570fd29300017bb106040575.jpg

1 回复 有任何疑惑可以回复我~
#1

小内存 提问者

非常感谢!
2016-04-15 回复 有任何疑惑可以回复我~

没反应啊,怎么玩T_Tt

0 回复 有任何疑惑可以回复我~

切屏时page 会清零

0 回复 有任何疑惑可以回复我~

试了楼上提供的方法,屏幕方向改变,照样乱套。。。

0 回复 有任何疑惑可以回复我~

666

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android-自定义ViewPager指示器
  • 参与学习       30028    人
  • 解答问题       75    个

带领大家实现最火爆的跟随型指示器,学完保准压倒一片

进入课程

屏幕方向改变后,tab的title定位不正确,怎么破?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信