服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - 举例讲解Android中ViewPager中的PagerTitleStrip子控件

举例讲解Android中ViewPager中的PagerTitleStrip子控件

2021-07-02 16:02匆忙拥挤repeat Android

这篇文章主要介绍了Android中ViewPager中的PagerTitleStrip子控件使用例子,讲解了PagerTitleStrip子控件的嵌入与设置标题的用法,需要的朋友可以参考下

先看个简单的,先上个效果图,吸引大家一下眼球。

举例讲解Android中ViewPager中的PagerTitleStrip子控件举例讲解Android中ViewPager中的PagerTitleStrip子控件

三个页面间的滑动,此时是带着上面的标题一块滑动的。
看一下android 对于pagertitlestrip的官方解释:

pagertitlestrip是viewpager的一个关于当前页面、上一个页面和下一个页面的一个非交互的指示器。它经常作为viewpager控件的一个子控件被被添加在xml布局文件中。在你的布局文件中,将它作为子控件添加在viewpager中。而且要将它的 android:layout_gravity 属性设置为top或bottom来将它显示在viewpager的顶部或底部。每个页面的标题是通过适配器的getpagetitle(int)函数提供给viewpager的。
着重讲两点:

1、首先,文中提到:在你的布局文件中,将它作为子控件添加在viewpager中。

2、第二,标题的获取,是重写适配器的getpagetitle(int)函数来获取的。

根据这两点,我们就可以看代码了:

1、xml布局文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.example.testviewpage_2.mainactivity" >
 
 <android.support.v4.view.viewpager
  android:id="@+id/viewpager"
  android:layout_width="wrap_content"
  android:layout_height="200dip"
  android:layout_gravity="center">
   
  <android.support.v4.view.pagertitlestrip
   android:id="@+id/pagertitle"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="top"
   />
   
 </android.support.v4.view.viewpager>
 
</relativelayout>

清楚的看到我们将.pagertitlestrip将其作为viewpager的子控件直接嵌入其中;这是第一步;当然android:layout_gravity=""的值要设置为top或bottom。将标题栏显示在顶部或底部。
2、重写适配器的getpagetitle()函数
便于大家有个整体认识,先贴全局代码,然后再逐个讲:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.example.testviewpage_2;
 
import java.util.arraylist;
import java.util.list;
import android.app.activity;
import android.os.bundle;
import android.support.v4.view.pageradapter;
import android.support.v4.view.pagertitlestrip;
import android.support.v4.view.viewpager;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
 
public class mainactivity extends activity {
 
 private view view1, view2, view3;
 private list<view> viewlist;// view数组
 private viewpager viewpager; // 对应的viewpager
  
 private list<string> titlelist; //标题列表数组
  
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  viewpager = (viewpager) findviewbyid(r.id.viewpager);
  layoutinflater inflater = getlayoutinflater();
  view1 = inflater.inflate(r.layout.layout1, null);
  view2 = inflater.inflate(r.layout.layout2, null);
  view3 = inflater.inflate(r.layout.layout3, null);
 
  viewlist = new arraylist<view>();// 将要分页显示的view装入数组中
  viewlist.add(view1);
  viewlist.add(view2);
  viewlist.add(view3);
   
  titlelist = new arraylist<string>();// 每个页面的title数据
  titlelist.add("王鹏");
  titlelist.add("姜语");
  titlelist.add("结婚");
 
  pageradapter pageradapter = new pageradapter() {
 
   @override
   public boolean isviewfromobject(view arg0, object arg1) {
    // todo auto-generated method stub
    //根据传来的key,找到view,判断与传来的参数view arg0是不是同一个视图
    return arg0 == viewlist.get((int)integer.parseint(arg1.tostring()));
   }
 
   @override
   public int getcount() {
    // todo auto-generated method stub
    return viewlist.size();
   }
 
   @override
   public void destroyitem(viewgroup container, int position,
     object object) {
    // todo auto-generated method stub
    container.removeview(viewlist.get(position));
   }
 
   @override
   public object instantiateitem(viewgroup container, int position) {
    // todo auto-generated method stub
    container.addview(viewlist.get(position));
     
    //把当前新增视图的位置(position)作为key传过去
    return position;
   }
    
   @override
   public charsequence getpagetitle(int position) {
    // todo auto-generated method stub
    return titlelist.get(position);
   }
  };
 
  viewpager.setadapter(pageradapter);
 
 }
 
}

3、变量

?
1
private list<string> titlelist; //标题列表数组

申请了一个string数组,用来存储三个页面所对应的标题的
4、初始化

?
1
2
3
4
titlelist = new arraylist<string>();// 每个页面的title数据
titlelist.add("王鹏");
titlelist.add("姜语");
titlelist.add("结婚");

在初始化阶段增加了这么一段初始化数组的代码。
5、重写charsequence getpagetitle(int )函数

?
1
2
3
4
5
@override
public charsequence getpagetitle(int position) {
 // todo auto-generated method stub
 return titlelist.get(position);
}

根据位置返回当前所对应的标题。


大家可以看到,其实这里仅仅只重写了getpagetitle()函数,将其根据不同的位置返回不同的字符串就可以实现上面的标题栏功能。第一和第二步有关数组和初始化,其实都是这了这一步,其实我们完全可以用下面这个代码来取代它们:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@override
public charsequence getpagetitle(int position) {
 // todo auto-generated method stub
 switch (position) {
 case 0:
  return "王鹏";
 case 1:
  return "姜语";
 case 2:
  return "结婚";
 
 default:
  return "";
 }
}

这样效果是一样一样的,只是代码不好维护而已。


设置标题
将page的title分离出来的一个自定义view,这样可以灵活的设置title的样式、文本。

效果:

举例讲解Android中ViewPager中的PagerTitleStrip子控件

举例讲解Android中ViewPager中的PagerTitleStrip子控件

xml使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<android.support.v4.view.viewpager xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/pager"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 
 <android.support.v4.view.pagertitlestrip
  android:id="@+id/pager_title_strip"
  android:layout_width="match_parent"
  android:layout_height="30dp"
  android:layout_gravity="bottom"
  android:paddingtop="4dp"
  android:paddingbottom="4dp" />
</android.support.v4.view.viewpager>

  android:layout_gravity 控制标题的位置  一般取值为 bottom或top

看到开源项目imageloader中使用了这个,找了半天没看到哪里findbyid的,
原来在它的源码里就把它想成是viewpager的子控件了。
部份源码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@override
 protected void onattachedtowindow() {
  super.onattachedtowindow();
 
  final viewparent parent = getparent();
  if (!(parent instanceof viewpager)) {
   throw new illegalstateexception(
     "pagertitlestrip must be a direct child of a viewpager.");
  }
 
  final viewpager pager = (viewpager) parent;
  final pageradapter adapter = pager.getadapter();
 
  pager.setinternalpagechangelistener(mpagelistener);
  pager.setonadapterchangelistener(mpagelistener);
  mpager = pager;
  updateadapter(mwatchingadapter != null ? mwatchingadapter.get() : null, adapter);
 }

  分析:在onattachedtowindow()时,直接找出parent-view,如果是viewpager才能使用,否则直接抛出异常。

设置title值:
pageradapter 里有一个getpagetitle(),需要重写它,然后可以根据不同的page返回不同的title。

?
1
2
3
4
5
6
7
8
9
10
11
@override
public charsequence getpagetitle(int position) {
 switch (position) {
  case 0:
   return getstring(r.string.title_list);
  case 1:
   return getstring(r.string.title_grid);
  default:
 return null;
 }
}

  而在pagetitlestrip的updatetext()源码里,调用了viewpager的adapter.getpagetitle,拿到title并设置。

延伸 · 阅读

精彩推荐
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11