ViewPager中的PagerTabStrip在运行测试的时候不显示问题解决

   
   刚在使用ViewPager的时候,向其中添加PagerTabStrip,然而在运行的时候PagerTabStrip完全没显示出来,仔细审查了好几遍代码,算是完全没问题,再运行还是不显示,这是什么问题,然后使用了PagerTitleStrip试了试,运行正常,然而PagerTabStrip是怎么回事呢,苦思冥想,回过头看其API,用法完全正确啊,哎,浪费了两个多小时,实在无法了,stackoverflow一下PagerTabStrip,在搜索首页就有个这样的为题:

在里面有两个回答:

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的控件.

    解决办法已经得到,我把上面代码添加到我的主Activity中(ViewPager的Activity),并修改其中id为我的PagerTabStrip的id。再试着运行了一下,终于显示出来了。
    到的此时,问题已经解决,第一个回答中曾给出一个同样的问题的连接,本着扩展视野的精神,点开瞧瞧,其实也有一点价值,可以对此问题的出现有更深的了解。
此问题大意翻译如下:
在目标为Android6.x(N)的app上,ViewPager中的PagerTabStrip不显示


我一个现有的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























解决办法和上面已经出现的解决办法是一样的,看其中的一个回答:

这有一个临时的解决方案,直到支持库解决了这个 issue:

((ViewPager.LayoutParams) pagerTabStrip.getLayoutParams()).isDecor = true;

看这里有这个 issue更全面的讨论:https://code.google.com/p/android/issues/detail?id=213359

这个链接是个提交和跟踪Android开源项目的问题的网站内容,打开此链接,此问题和比较有价值的话语的大意如下:

Issue 213359: PagerTabStrip在 com.android.support library 24.0.0上不工作

Reported by [email protected]Jun 16, 2016
我把项目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 预览版测试的.

Jun 19, 2016
#7 [email protected]
正确的解决方案:

((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 属性, 所以我们只好在代码中去设置.
Project Member #9 [email protected]
不完全是. Annotations 也可以inherited(遗传), 但是我们没有添加 @Inherited 标识到 这个annotation.
Jun 21, 2016
#10 [email protected]
我的意思是说默认是不能inherited .你提到的这个标识 (flag)当然也可以解决这个问题.
     
        此时,这个问题出现的原因,也已经知道了,它也许是官方的一个疏忽导致的,将来或者是过几天就会被消灭,但现在记住解决办法就ok了,就是在ViewPager所在的Activity的onCreadView()方法中,添加一句代码就行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章