热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android中viewpager滑动指示器的实例代码

本文通过实例代码给大家介绍了android中viewpager滑动指示器,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下

先看下效果图:

这个需要用到1个开源的 库,这个后面也会说下的。

工程目录:

1. MainActivity.java

public class MainActivity extends FragmentActivity { 
  private ViewPagerFrameAdapter adapter;  //适配器(标题和内容) 
 private ViewPager mPager;        
 private TabPageIndicator   tabbPageIndicator;   // 
 private UnderlinePageIndicatorEx underlinePageIndicator; 
 private int COUNT = 0; 
 private List titles = new ArrayList(); //标题 
 @Override 
 protected void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_main); 
    //标题,这里自己造的假数据 
    for (int j = 0; j <3 ; j++){ 
     titles.add( "第"+ j +"标签卡"); 
    } 
    mPager = (ViewPager)findViewById(R.id.pager); 
    adapter = new ViewPagerFrameAdapter(getSupportFragmentManager(),titles); 
    mPager.setAdapter(adapter); 
    //得到指示器 
    tabbPageIndicator = (TabPageIndicator) findViewById(R.id.tab_indicator);  
    tabbPageIndicator.setViewPager(mPager); 
    //下标 
    underlinePageIndicator = (UnderlinePageIndicatorEx)findViewById(R.id.underline_indicator); 
    underlinePageIndicator.setViewPager(mPager); 
    underlinePageIndicator.setFades(false); 
    //设置指示器 
    tabbPageIndicator.setOnPageChangeListener(underlinePageIndicator); 
 } 
 //adapter 没啥好说的 跟前面的一样 
 private class ViewPagerFrameAdapter extends FragmentStatePagerAdapter{ 
  private List title; //页面标题头部数据 
  public ViewPagerFrameAdapter(FragmentManager fm, List title) { 
   super(fm); 
   this.title = title; 
  } 
  //根据position 返回 fragment 
  @Override 
  public Fragment getItem(int position) { 
   return ArrayFragment.newInstance(position); 
  } 
  //size 
  @Override 
  public int getCount() { 
    return title.size(); 
  } 
  //顶部的title 
  @Override 
  public CharSequence getPageTitle(int position) { 
   if (titles != null){ 
    return titles.get(position).toString(); 
   } 
   return super.getPageTitle(position); 
  }  
 } 
} 

UnderlinePageIndicatorEx.java

//继承这个然后重写 
public class UnderlinePageIndicatorEx extends UnderlinePageIndicator{ 
  public UnderlinePageIndicatorEx(Context context) { 
   super(context, null);   
  } 
  public UnderlinePageIndicatorEx(Context context, AttributeSet attrs) { 
   super(context, attrs, R.attr.vpiUnderlinePageIndicatorStyle);  
  } 
  public UnderlinePageIndicatorEx(Context context, AttributeSet attrs, int defStyle) { 
   super(context, attrs, defStyle);   
  } 
  //自身的 ViewPage传递过去 
  @Override 
  public void setViewPager(ViewPager viewPager) { 
   if (mViewPager == viewPager){ 
    return; 
   } 
//   if (mViewPager != null) { 
//    mViewPager.setOnPageChangeListener(null); 
//   } 
   if (viewPager.getAdapter() == null) { 
    throw new IllegalStateException(" pager 没有 加入 adapter"); 
   } 
   mViewPager = viewPager; 
//   mViewPager.setOnPageChangeListener(this); 
   invalidate(); 
   post(new Runnable(){ 
    @Override public void run() { 
     if (mFades) { 
      post(mFadeRunnable); 
     } 
    }  
   }); 
  } 
} 

ArrayFragment.java

public class ArrayFragment extends Fragment{ 
 private int position; 
 public ArrayFragment(int position){ 
  this.position = position; 
 } 
  // 返回 viwePager 下面滑动的页面 
 public static ArrayFragment newInstance(int position){ 
  return new ArrayFragment(position); 
 } 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
 } 
 @Override 
 public void onDestroy() { 
  super.onDestroy(); 
 } 
 // 根据position 返回不同的view 
 @Override 
 public View onCreateView(LayoutInflater inflater, ViewGroup container, 
   Bundle savedInstanceState) { 
  View view = inflater.inflate(R.layout.layoutaa, null);  
  return view; 
 } 
} 

好了接下来是 布局xml了。

 
  
   
     
     
    
    
 

接下来设置 滑动指示器的style 

 
  
  
  
  
  
  

 selector_tab.xml     这个是 选择器 在style中引用的,是用来切换 被选中的背景色的

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
  
  
  
 


推荐阅读
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 解决Anaconda安装TensorFlow时遇到的TensorBoard版本问题
    本文介绍了在使用Anaconda安装TensorFlow时遇到的“Could not find a version that satisfies the requirement tensorboard”错误,并提供详细的解决方案,包括创建虚拟环境和配置PyCharm项目。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 查找最小值的操作是很简单的,只需要从根节点递归的遍历到左子树节点即可。当遍历到节点的左孩子为NULL时,则这个节点就是树的最小值。上面的树中,从根节点20开始,递归遍历左子 ... [详细]
  • 在使用STM32Cube进行定时器配置时,有时会遇到延时不准的问题。本文探讨了可能导致延时不准确的原因,并提供了解决方法和预防措施。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • DeepMind迁入谷歌伦敦新总部:人工智能研究的新里程碑
    谷歌旗下的人工智能研究机构DeepMind已正式入驻位于伦敦国王十字车站潘克拉斯广场6号的新总部。这座现代化的办公大楼不仅为DeepMind提供了宽敞的研究空间,也象征着谷歌对AI技术发展的高度重视。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文将探讨Java编程语言中对象和类的核心概念,帮助读者更好地理解和应用面向对象编程的思想。通过实际例子和代码演示,我们将揭示如何在Java中定义、创建和使用对象。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • 本文详细介绍了如何在 Android 开发中高效地管理和使用资源,包括本地资源和系统资源的访问方法。通过实例和代码片段,帮助开发者更好地理解和应用资源管理的最佳实践。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
author-avatar
颓废胖胖2502908443
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有