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

原创 2016年07月18日 06:40:55
   
   刚在使用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 andrewpm...@gmail.comJun 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 unrealri...@gmail.com
正确的解决方案:

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

<Android 基础(十七)> ViewPager

ViewPager的简单介绍和使用
  • poorkick
  • poorkick
  • 2016年07月09日 08:53
  • 1591

Android多屏滑动:ViewPager基础使用及PagerTabStrip先天缺陷(附源码)

最近要用ViewPager,看了几个人的帖子都说的不太明白,干脆自己写个demo总结下。例子很简单,Activity里有三个界面可以滑动,每一个界面都有一个button并设置好了监听。PagerTab...
  • yanzi1225627
  • yanzi1225627
  • 2014年04月20日 19:25
  • 22882

Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果

原帖:http://www.cnblogs.com/trinea/archive/2012/11/23/2771273.html 本文主要介绍如何利用ViewPager、Fragment、Pager...
  • ximen250
  • ximen250
  • 2013年06月08日 18:03
  • 14638

ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同

前言:
  • harvic880925
  • harvic880925
  • 2014年08月12日 22:00
  • 74850

ViewPager 详解(三)——PagerTabStrip与PagerTitleStrip添加标题栏

ViewPager 详解(三)——PagerTabStrip与PagerTitleStrip添加标题栏
  • u010356768
  • u010356768
  • 2017年05月31日 18:07
  • 450

Android开发学习之使用ViewPager+PagerTabStrip制作可滑动的Tab

在昨天的文章中,我们使用ViewPager制作了一个简单的滑动切换的例子。今天让我们在昨天的基础之上,利用ViewPager来制作一个可以滑动的Tab。要实现这样的功能,除了ViewPager外,我们...
  • qinyuanpei
  • qinyuanpei
  • 2013年12月08日 13:34
  • 17728

使用ViewPager加载页面出现空白

原文链接:http://blog.csdn.net/zjf1165/article/details/51076642首次启动程序时首页空白,切换页面后正常为了便于管理,通常为ViewPager的每个子...
  • axi295309066
  • axi295309066
  • 2016年11月29日 01:07
  • 2309

使用ViewPager加载页面出现空白--笔记

带有ViewPager的程序,首次启动时首页空白,而切换页面后回到首页正常显示为了便于管理,通常为ViewPager的每个子页面 建立一个基类,然后用一个集合(一般用ArrayList)承载该Vie...
  • zjf1165
  • zjf1165
  • 2016年04月06日 17:14
  • 3072

ViewPager+Fragment如何控制界面显示时才加载数据

ViewPager+Fragment的模式再常见不过了,以国民应用微信为例,假设微信也是ViewPager+Fragment的实现方式,那表现形式上就是一个ViewPager管理了四个Fragment...
  • AugusAccount
  • AugusAccount
  • 2017年02月08日 11:30
  • 1581

ViewPager与PagerTabStrip的基本使用方法

在android开发中viewpager是一个实用性超强的控件。下面就viewpager的基本使用做一些总结。 ####Viewpager的基本用法 ViewPager是android扩展包v4包中...
  • CreazyTomato
  • CreazyTomato
  • 2017年02月18日 20:32
  • 220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ViewPager中的PagerTabStrip在运行测试的时候不显示问题解决
举报原因:
原因补充:

(最多只允许输入30个字)