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

Android仿微信底部实现Tab选项卡切换效果

这篇文章主要为大家介绍了Android仿微信底部实现Tab选项卡切换效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在网上看了比较多的关于Tab的教程,发现都很杂乱。比较多的用法是用TitlePagerTabStrip和ViewPaper。不过TitlePagerTabStrip有个很大的缺陷,Tab里面的内容刚进去是没有的,要滑一次才能加载出来。而且滑动的时候,Tab里面的内容位置不是固定的,滑倒最后会出现一片空白,非常不美观。虽然有其他的补救方法,但是非常的麻烦,所以我就按照自己的方法实现了一个,功能不错而且非常简单。

 直接点击或者是滑动界面,都可以转到相应的页面。

效果图:

 原理是用了三个按钮和ViewPaper,抛弃了TitlePagerTabStrip。

 ViewPaper通俗的说,它是一个装页面的容器。如上图我有三个不同的界面,是因为我把三个view加了进去。然后再把这个viewPaper加到主界面的布局中。

这样,主界面上就有三个按钮,按钮下方是一个viewPaper,这个viewPaper里面有三个view,我每滑一下或点击按钮就会跳到相应的view。

就是说我们看到的,其实都是主界面,按钮是一直在那的。我们只是不断的转换viewPaper这个容器里面的视图而已。

主界面的布局代码:



 
 

怎么实现,按相应的按钮跳转到viewPaper中相应的视图呢?很简单,只要为按钮设置监听,然后调用viewPaper的setCurrentItem()这个函数就行。

对于相应的页面,我们的按钮也应该有相应的变化,如上图我们的按钮中的英文变成了√。这个只要在viewPaper的监听器中重载onPageSelected()这个函数就行,

每个页面被选中,都会调用这个函数。在这个函数里判断当前的页面是哪一个,然后再对按钮做出相应的改变即可。
onCreate的代码

 //设置viewPaper
 ViewPager pager = null;
 ArrayList viewCOntainter= new ArrayList();

 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_add);

  //实例化ViewPaper
  pager = (ViewPager) this.findViewById(R.id.viewpager3);



  //设置按钮跳转到相应的viewPaper页面
  
  按钮1.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {

    //跳到第一个页面
    pager.setCurrentItem(0);

   }
  });

  按钮2.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {

    //第二个页面
    pager.setCurrentItem(1);

   }
  });
  
  按钮3.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {

    //第三个页面
    pager.setCurrentItem(2);

   }
  });
  
  //为viewPaper设置内容
  //view是我们放进viewPaper里面的东西,要为它设置好布局,再放进去
  View view1 = LayoutInflater.from(this).inflate(R.layout.自己的布局文件1, null);
  View view2 = LayoutInflater.from(this).inflate(R.layout.自己的布局文件2, null);
  View view3 = LayoutInflater.from(this).inflate(R.layout.自己的布局文件3, null);

  //这是个ArrayList,加进去了3个view
  viewContainter.add(view1);
  viewContainter.add(view2);
  viewContainter.add(view3);
  

  //设置适配器 这里的代码复制即可
  pager.setAdapter(new PagerAdapter() {


   //viewpager中的组件数量
   @Override
   public int getCount() {
    return viewContainter.size();
   }

   //滑动切换的时候销毁当前的组件

   @Override
   public void destroyItem(ViewGroup container, int position,
         Object object) {
    ((ViewPager) container).removeView(viewContainter.get(position));
   }

   //每次滑动的时候生成的组件
   @Override
   public Object instantiateItem(ViewGroup container, int position) {
    ((ViewPager) container).addView(viewContainter.get(position));
    return viewContainter.get(position);
   }

   @Override
   public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == arg1;
   }

   @Override
   public int getItemPosition(Object object) {
    return super.getItemPosition(object);
   }


  });

  //页面变化时的监听 改变按钮
  pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
   @Override
   public void onPageScrolled(int i, float v, int i1) {

   }

   @Override
   public void onPageSelected(int i) {

    switch (i) {

     //如果是第一个页面
     case 0:
      按钮1.setText("√");
      按钮2.setText("TAB2");
      按钮3.setText("TAB3");

      break;

     //如果是第二个页面
     case 1:
      按钮1.setText("TAB1");
      按钮2.setText("√");
      按钮3.setText("TAB3");
      break;
      
     //如果是第三个页面
     case 1:
      按钮1.setText("TAB1");
      按钮2.setText("TAB2");
      按钮3.setText("√");
      break;



    }

   }

   @Override
   public void onPageScrollStateChanged(int i) {

   }
  });

 }

想用到每个view里面的控件的话,在主界面上是找不到这些控件的,都是空的。 必须在instantiateItem这个函数里面指定。

@Override
   public Object instantiateItem(ViewGroup container, int position) {
    ((ViewPager) container).addView(viewContainter.get(position));

    switch (position){

     case 0: {

      //在第一个页面中

      }
     }
}

以上就是本文的全部内容,希望对大家的学习有所帮助。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
author-avatar
你不懂_de_笑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有