1,这个问题和这个是同样的问题:
PagerTabStrip not showing in ViewPager in app targeting Android 6.X (N)
目标是Android N的应用, 需要使用下面的解决办法:
在 onCreateView(), 添加:
((ViewPager.LayoutParams) (view.findViewById(R.id.tab_strip)).getLayoutParams()).isDecor = true;
2,把下面这行从 tab1.onCreateView(...)
.方法中移除..
((ViewPager.LayoutParams) (view.findViewById(R.id.tab_strip)).getLayoutParams()).isDecor = true;
... 添加它到 MainActivity.onCreate(...)
中.
app 就不会出错了.
你的 tab1
Fragment
不会知道 R.id.tab_strip
view控件.
这是 MainActivity
class的控件.
|
我一个现有的app,使用了ViewPager和PagerTabStrip,它们都是使用多版本的Android SDK 和
下面是声明的 <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>
这是代码写错了还是 |
|
这有一个临时的解决方案,直到支持库解决了这个 issue: ((ViewPager.LayoutParams) pagerTabStrip.getLayoutParams()).isDecor = true; 看这里有这个 issue更全面的讨论:https://code.google.com/p/android/issues/detail?id=213359 |
Issue 213359: | PagerTabStrip在 com.android.support library 24.0.0上不工作 |
我把项目sdk版本更新到 24,支持库也同时更新了 and therefore upgraded my support libraries.
这时PagerTabStrip不出现了.
甚至把项目选项改 "Tabbed activity" 作为默认的启动activity ,在 ViewPager添加 PagerTabStrip 还是不显示
e.g.
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
<android.support.v4.view.PagerTabStrip
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff0000"
android:layout_gravity="top"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:textColor="#000000" />
</android.support.v4.view.ViewPager>
但是当支持库再用 23.3.0 它又会显示.
我是在 nexus 6 运行的 N preview 4 预览版测试的.
不完全是. Annotations 也可以inherited(遗传), 但是我们没有添加 @Inherited 标识到 这个annotation.
我的意思是说默认是不能inherited .你提到的这个标识 (flag)当然也可以解决这个问题.
正确的解决方案: ((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 属性, 所以我们只好在代码中去设置.