屏幕方向改變后,tab的title定位不正確,怎么破?
講得挺好,學(xué)到挺多的,就是有倆問題:一個是當(dāng)滑動到最后一個時,應(yīng)不進(jìn)入ViewPagerIndicator滑動,不然會造成最后留有一個tab寬度的空余;還有一個問題就是在處于顯示區(qū)域外的item時,即我們tab有10,設(shè)置可顯示為3個,當(dāng)三角形處于大于第三個的地方,如第六個時,調(diào)轉(zhuǎn)屏幕方向,發(fā)現(xiàn)ViewPagerIndicator的title會從第一個顯示起,而不會直接定位到三角形指示的title,但ViewPager定位頁面是正確的。怎么破?
2016-04-15
對于第一個問題,可以讓三角形滑動到最后一個tab再執(zhí)行scrollTo()方法,在原有代碼scroll
()方法上修改為:
? ?public void scroll(int position, float positionOffset) {
? ?int tabWidth = getWidth() / mTabVisibleCount;
? ?mTranslationX = (int) (tabWidth * (positionOffset + position));
? ?//容器移動,當(dāng)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();
}
修改代碼后效果如下:
對于第二個問題,涉及到View狀態(tài)的存儲與恢復(fù),可參考Android-五子連珠課程,
附上代碼如下:
在原有代碼上增加屬性:
private int myPosition;//用來記錄當(dāng)前選擇的position
private static final String INSTANCE = "instance";
private static final String MYPOSITION = "myPosition";
private static boolean isSave = false;//是否切屏的標(biāo)識
1.在原有代碼上增加
..................
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? myPosition = position;//只增加這一句,保存當(dāng)前的position
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? scroll(position, positionOffset);
????????????????????????????????}
................
2.重寫onSaveInstanceState()方法和onRestoreInstanceState(Parcelable state)方法(直接復(fù)制即可):
@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)方法(直接復(fù)制即可):
@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;
? ?}
}
運(yùn)行效果如下:
2022-03-27
沒反應(yīng)啊,怎么玩T_T那個t不能大寫。
2017-08-13
切屏?xí)rpage 會清零
2016-07-12
試了樓上提供的方法,屏幕方向改變,照樣亂套。。。
2016-06-12
666