我一个现有的app,使用了ViewPager和PagerTabStrip,它们都是使用多版本的Android SDK 和 com.android.support:appcompat-v7
都正常运行并且有一段时间了.但当我试图去完善并且把目标 SDK版本从app的 23
改成 24
而且 com.android.support:appcompat-v7
版本也从 23.4.0
改成 24.0.0
.的时候,我发现 PagerTabStrip
从 ViewPager
消失不见了, (不仅仅是 PagerTabStrip
中的titles ,.而是整个 PagerTabStrip
从 ViewPager
不见了.)
下面是声明的 ViewPager
和 PagerTabStrip
的布局文件:
<android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.PagerTabStrip android:id="@+id/pagerTabStrip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:paddingTop="8dp" android:paddingBottom="8dp" android:textColor="@android:color/white" android:background="@color/view_bg_blue" /> </android.support.v4.view.ViewPager>
这是代码写错了还是 ViewPager
或者 PagerTabStrip
的一个bug
正确的解决方案: ((ViewPager.LayoutParams) tabStrip.getLayoutParams()).isDecor = true; 先来说它的工作原理. 当把一个一个View添加到一个ViewPager的时候,它会获取它的布局参数并且更新他们 , 包括决定View是不是应该作为装饰显示的 isDecor 参数. 先前,所有实现ViewPager.Decor接口的View都是由ViewPager 设置的. PagerTitleStrip 实现了它,而且继承PagerTabStrip 扩展了它,运行正常.
在24.0.0 ,这个接口被这个annotation(注解) ViewPager.DecorView 取代了,不知道什么原因,并且这个annotation需要由view的类型处理. 所以现在 PagerTitleStrip 是annotated(注解过的) ,而不是实现了这个接口, 但是 Android developers 忘记在PagerTabStrip添加相同的 annotation,并且这样的 annotations也是不能由inherited(遗传)得到的 , 就不再有作用了.
解决办法是只需要手动设置一下参数. 其实在 XML文件里设置它会更好,但遗憾的是没有相应的 XML 属性, 所以我们只好在代码中去设置.