举例讲解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布局文件:

<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()函数
便于大家有个整体认识,先贴全局代码,然后再逐个讲:

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、变量

private List<String> titleList; //标题列表数组

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

titleList = new ArrayList<String>();// 每个页面的Title数据
titleList.add("王鹏");
titleList.add("姜语");
titleList.add("结婚");

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

@Override
public CharSequence getPageTitle(int position) {
 // TODO Auto-generated method stub
 return titleList.get(position);
}

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

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

@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的样式、文本。

效果:

xml使用:

<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的子控件了。
部份源码:

@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。

@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并设置。

(0)

相关推荐

  • Android 控件(button)对齐方法实现详解

    1,android:orientation 布局方向.horizontal是让所有的子元素按水平方向从左到右排列, vertical是让所有的子元素按竖直方向从上到下排列. 2,android:gravity 与 android:layout_gravity的区别android:gravity是指定本元素的子元素相对它的对齐方式. android:layout_gravity是指定本元素相对它的父元素的对齐方式. 例如: 下面这里的linearlayout的android:gravity设为ri

  • 详解Android中ViewPager的PagerTabStrip子控件的用法

    我们先来看一个小例子: 可以看到,效果实现的也是很棒,比之前自定义的标签指示器更加的流畅.下面,简单介绍一下 PagerTabStrip和它的使用. PagerTabStrip是v4支持包里面的类,是ViewPager专用的类,不能在其他地方使用.在使用的时候,我们只需要在ViewPager的布局里面声明即可. 如下面的代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

  • 如何让安卓(Android)子控件超出父控件的范围显示

    先来看一张预览图: 废话不多说,直接上代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false"> <Imag

  • Android ScrollView只能添加一个子控件问题解决方法

    本文实例讲述了Android ScrollView只能添加一个子控件问题解决方法.分享给大家供大家参考,具体如下: 有下面一段代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent

  • android 自定义控件 自定义属性详细介绍

    自定义控件在android中无处不见,自定义控件给了我们很大的方便.比如说,一个视图为imageview ,imagebutton ,textview 等诸多控件的组合,用的地方有很多,我们不可能每次都来写3个的组合,既浪费时间,效率又低.在这种情况下,我们就可以自定义一个view来替换他们,不仅提升了效率并且在xml中运用也是相当的美观. 一.控件自定义属性介绍 以下示例中代码均在values/attrs.xml 中定义,属性均可随意命名. 1. reference:参考某一资源ID. 示例:

  • android中webview控件和javascript交互实例

    当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释: 复制代码 代码如下: A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit

  • Android控件系列之EditText使用方法

    学习目的: 1.掌握在Android中如何建立EditText2.掌握EditText的常用属性3.掌握EditText焦点的事件.按键的事件(监听器) 介绍: EditText是接受用户输入信息的最重要控件.通过前面课程的学习,您可能会猜到可以利用EditText.getText()获取它的文本,但真正的项目中,可能没那么简单,需要更多的限制,如文本长度限制,是否数字限制等等. 鉴于手机屏幕尺寸有限,您可能总想着如何节约控件.在每个用户需要填写内容的文本框的左边加上标题在PC上是一种优雅的方法

  • android控件封装 自己封装的dialog控件

    自定义dialog肯定是用的很多了但是感觉每次做都是很乱 单纯完成任务而已,现在封装了一下 以后用到直接copy 先上图: 主activity 复制代码 代码如下: package com.su.testcustomdialog; import com.su.testcustomdialog.MyDialog.Dialogcallback; import android.app.Activity; import android.os.Bundle; import android.view.Vie

  • Android控件之ToggleButton的使用方法

    ToggleButton的状态只能是选中和未选中,并且需要为不同的状态设置不同的显示文本. 以下案例为ToggleButton的用法 目录结构 main.xml布局文件 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    androi

  • Android控件系列之ImageView使用方法

    学习目的: 1.掌握在Android中如何插入图片 图片的加入可以立刻让您的程序增色不少,我们样例选用一张Android机器人(picture.jpg),您可以使用自己的任何图片进行试验 一般建议您程序中的图片加入资源,而不是放在SD卡中用流的方式去读取,毕竟嵌入的资源比较安全,不容易被篡改. 1.导入图片到资源 将图片拖拽到项目res\drawable开头的3个文件夹下,他们分别代表了高.中.低分辨度的图片.Android读取图片时自动优化,选用合适的一个图片显示,比如高分辨率可以存放128*

  • android自定义倒计时控件示例

    自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.content.Context;import android.content.res.TypedArray;import android.graphics.Paint;import android.text.Html;import android.util.AttributeSet;import android.widget.TextView; import com.new0315.R;

随机推荐