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

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

三个页面间的滑动,此时是带着上面的标题一块滑动的。
看一下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并设置。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, viewpager
PagerTitleStrip
自定义viewpager控件、viewpager 获取子控件、viewpager控件、viewpager 标题栏控件、pagertitlestrip,以便于您获取更多的相关知识。

时间: 2024-08-27 04:13:36

举例讲解Android中ViewPager中的PagerTitleStrip子控件_Android的相关文章

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

先看个简单的,先上个效果图,吸引大家一下眼球. 三个页面间的滑动,此时是带着上面的标题一块滑动的. 看一下android 对于PagerTitleStrip的官方解释: PagerTitleStrip是ViewPager的一个关于当前页面.上一个页面和下一个页面的一个非交互的指示器.它经常作为ViewPager控件的一个子控件被被添加在XML布局文件中.在你的布局文件中,将它作为子控件添加在ViewPager中.而且要将它的 android:layout_gravity 属性设置为TOP或BOT

qtcreator-qt中删除布局内的子控件

问题描述 qt中删除布局内的子控件 开发环境为win7旗舰版,qt creator3.4-msvc,qt库为5.4版本的,现在在一个界面中添加了一个垂直布局,布局内有QLabel标签,因为标签数目不确定,所以用了QList来管理,可以随意增减.那么希望在更新标签时将原有标签中除了前6个外先全部彻底删除,但是我用了很多方法都没有达到效果,原有标签还是会显示 QLayoutItem *child = this->layout()->takeAt(6); for(int count = 0;coun

Android高仿微信支付密码输入控件_Android

像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现这个功能. 老样子,投篮需要找准角度,变成需要理清思路.对于这个"小而美"的控件,我们思路应该这样子. Ⅰ.将要输入密码数量动态通过代码加载出来. Ⅱ.利用Gridview模拟产生一个输入数字键盘,并且按照习惯从屏幕底部弹出来. Ⅲ.对输入数字键盘进行事件监听,将这个输入数字填入到这个密码框中,并且当您输入密码长度一致的时候,进行事件回调. 这个思维导图应该是这样的: 首先,我们要根据需求动态加

Android自定义View实现多图片选择控件_Android

前言 相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最经典的莫过于微信的图片选择了.所有很多情况下会使用到多图选择,所以就有了这篇文章,今天抽点时间写了个控件.  •支持自定义选择图片的样式  •支持设置图片选择数量  •支持图片预览,删除  •支持图片拍照  先来看看效果 实现分析 假如不定义控件,我们要实现这样一个功能,无非是写个GridView在item点击的时候去显示图片进行选择,在返回界面的时候进行GridView的数据刷新.我们把这些逻辑写在我们自定义的GridView

Android实现动态圆环的图片头像控件_Android

先看效果图: 现在大部分的app上难免会使用到圆形头像,所以今天我给大家分享一个单独使用的,并且周围带有圆环动画的花哨圆形头像控件,本控件是在圆形头像控件基础上实现的,只是在其周围再画一些不同大小的圆而已,就可以实现如图的效果. 圆形头像的基本原理是将设置的资源文件转化成Bitmap,然后通过BitmapShader类将Bitmap成为Paint的渲染器,然后在onDraw()中通过canvas.drawCircle(rx,ry,radius,paint);画布上画圆,而这个圆就是形成了圆形头像

Android实现动态定值范围效果的控件_Android

先来看看效果: 一.添加依赖库的步骤 1.项目的gradle文件内的做以下改动 allprojects { repositories { ... maven { url "https://jitpack.io" } } } 2.添加最新版本的依赖库,最新版本如右所示,修改末尾的版本即可(因为我有时候更新版本了会忘记修改readme) dependencies { compile 'com.github.Brioal:BrioalSetting:1.0' ////例如上面最新版本是1.1

Android自定义商品购买数量加减控件_Android

在购买商品时,大家可以自定义数字加减控件,来确定购买商品的实际数量,如何实现此控件,请参考下文: 1.自定义数字加减控件的要求 创建Module -NumberAddSubView A_输入的只能是数字,而且不能通过键盘输入 B_通过加减按钮操作数字 C_监听加减按钮 D_数组有最小值和最大值的限制 E_自定义属性  2.提供接口,让外界监听到数字的变化 1_设置接口 @Override public void onClick(View v) { if (v.getId() == R.id.bt

举例讲解Android应用开发中OTTO框架的基本使用_Android

OTTO是一个EventBus类型的事件传输总线,它可以提供"存储转发"的功能,让你APP中各个组件的交流更加便利,让你的程序分层更加清晰. 使用场景OTTO基于Observer设计模式.它有发布者,订阅者这两个主要对象.OTTO的最佳实践就是通过反射牺牲了微小的性能,同时极大的提高了程序的耦合度,更加利于MVP分工开发与维护.业务层开发者在处理资源(比如Db, REST等)后并发布消息,展示层开发者(比如Activity/Fragment)就可以处理消息,而不用关心数据是怎么来的(在

举例讲解Android应用开发中OTTO框架的基本使用

OTTO是一个EventBus类型的事件传输总线,它可以提供"存储转发"的功能,让你APP中各个组件的交流更加便利,让你的程序分层更加清晰. 使用场景 OTTO基于Observer设计模式.它有发布者,订阅者这两个主要对象.OTTO的最佳实践就是通过反射牺牲了微小的性能,同时极大的提高了程序的耦合度,更加利于MVP分工开发与维护.业务层开发者在处理资源(比如Db, REST等)后并发布消息,展示层开发者(比如Activity/Fragment)就可以处理消息,而不用关心数据是怎么来的(