热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安卓开发Tab的实现TabLayout+ViewPager+Fragment

文章目录分析动手Fragment布局文件MyFragmentActivity布局文件TabLayoutFragmentViewPagerFragmentTabLayout和View


文章目录

    • 分析
    • 动手
      • Fragment
          • 布局文件
          • MyFragment
      • Activity
          • 布局文件
          • TabLayout+Fragment
          • ViewPager+Fragment
          • TabLayout和ViewPager变化时同步



先来看一下效果图

在这里插入图片描述


分析

TabLayout的基本组成:


  • Activity
  • Activity的layout.xml
  • Fragment或View

ViewPager基本组成:


  • Activity
  • Activity的layout.xml
  • 继承FragmentPagerAdapter的类
  • Fragment或View

Fragment基本组成


  • 继承Fragment的类
  • Fragment的layout.xml

组合后:


  • Activity
  • Activity的layout.xml
  • 继承FragmentPagerAdapter的类
  • 继承Fragment的类
  • Fragment的layout.xml



动手

步骤:


  1. TabLayout与Fragment
  2. ViewPager与Fragment
  3. TabLayout和ViewPager变化时同步

Fragment


布局文件


<RelativeLayout xmlns:android&#61;"http://schemas.android.com/apk/res/android"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"><TextViewandroid:id&#61;"&#64;&#43;id/i17_fragment_text"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"android:gravity&#61;"center"android:text&#61;"文本"android:textSize&#61;"32sp" />
RelativeLayout>



MyFragment

public class MyFragment extends Fragment {private static final String ARG_PARAM1 &#61; "param1";private String mParam1;&#64;Nullable&#64;Overridepublic View onCreateView(&#64;NonNull LayoutInflater inflater, &#64;Nullable ViewGroup container, &#64;Nullable Bundle savedInstanceState) {View view &#61; inflater.inflate(R.layout.fragment_a17_text, container, false);TextView text &#61; view.findViewById(R.id.i17_fragment_text);// 使用bundle传递参数Bundle bundle &#61; getArguments(); if (bundle !&#61; null) text.setText(bundle.getString("title"));// 使用newInstance传递参数if (mParam1 !&#61; null)text.setText(mParam1);return view;}// 可以设置多个参数public static MyFragment newInstance(String param1) {MyFragment fragment &#61; new MyFragment();Bundle args &#61; new Bundle();args.putString(ARG_PARAM1, param1);fragment.setArguments(args);return fragment;}&#64;Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() !&#61; null) {mParam1 &#61; getArguments().getString(ARG_PARAM1);}}
}



Activity


布局文件


<RelativeLayout xmlns:android&#61;"http://schemas.android.com/apk/res/android"xmlns:tools&#61;"http://schemas.android.com/tools"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"tools:context&#61;".activity.A20UnitTVF"><com.google.android.material.tabs.TabLayoutandroid:id&#61;"&#64;&#43;id/i20_tab"android:layout_width&#61;"match_parent"android:layout_height&#61;"50dp" /><androidx.viewpager.widget.ViewPagerandroid:id&#61;"&#64;&#43;id/i20_content"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"android:layout_below&#61;"&#64;&#43;id/i20_tab" />
RelativeLayout>



TabLayout&#43;Fragment

public class A20UnitTVF extends AppCompatActivity {private List<MyFragment> mFragments;private ViewPager mViewPager;private TabLayout mTabLayout;&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_a20_unit_t_v_f);init();}private void init(){ mFragments &#61; new ArrayList<>();mFragments.add(MyFragment.newInstance("首页Fragment"));mFragments.add(MyFragment.newInstance("消息Fragment"));mFragments.add(MyFragment.newInstance("个人中心Fragment")); mTabLayout &#61; findViewById(R.id.i20_tab);mTabLayout.addTab(mTabLayout.newTab().setText("首页"));mTabLayout.addTab(mTabLayout.newTab().setText("消息"));mTabLayout.addTab(mTabLayout.newTab().setText("个人中心")); }
}



ViewPager&#43;Fragment

private void init(){// ....mViewPager &#61; findViewById(R.id.i20_content);mViewPager.setAdapter(new A20TVFAdapter(getSupportFragmentManager(),0,mFragments));
}



TabLayout和ViewPager变化时同步

  1. 点击tab&#xff0c;ViewPager滑动到相应的位置

    主要方法mViewPager.setCurrentItem(position)

    mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){&#64;Overridepublic void onTabSelected(TabLayout.Tab tab) {mViewPager.setCurrentItem(tab.getPosition());// 不要切换动画// mViewPager.setCurrentItem(tab.getPosition(),false);}&#64;Overridepublic void onTabUnselected(TabLayout.Tab tab) {}&#64;Overridepublic void onTabReselected(TabLayout.Tab tab) {}
    });

  2. 滑动ViewPager&#xff0c;TabLayout的指示器定位到相应位置

    主要方法&#xff1a;mTabLayout.getTabAt(position).select();

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {&#64;Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}&#64;Overridepublic void onPageSelected(int position) {mTabLayout.getTabAt(position).select();}&#64;Overridepublic void onPageScrollStateChanged(int state) {}
    });

综上&#xff0c;我们可以得到一个整理后的Activity

public class A20UnitTVF extends AppCompatActivity {private List<MyFragment> mFragments;private ViewPager mViewPager;private TabLayout mTabLayout;&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_a20_unit_t_v_f);init();}private void init(){mFragments &#61; new ArrayList<>();mFragments.add(MyFragment.newInstance("首页"));mFragments.add(MyFragment.newInstance("消息"));mFragments.add(MyFragment.newInstance("个人中心"));mTabLayout &#61; findViewById(R.id.i20_tab);mTabLayout.addTab(mTabLayout.newTab().setText("首页"));mTabLayout.addTab(mTabLayout.newTab().setText("消息"));mTabLayout.addTab(mTabLayout.newTab().setText("个人中心"));mViewPager &#61; findViewById(R.id.i20_content);mViewPager.setAdapter(new A20TVFAdapter(getSupportFragmentManager(),0,mFragments));mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){&#64;Overridepublic void onTabSelected(TabLayout.Tab tab) {mViewPager.setCurrentItem(tab.getPosition());// 不要切换动画// mViewPager.setCurrentItem(tab.getPosition(),false);}&#64;Overridepublic void onTabUnselected(TabLayout.Tab tab) {}&#64;Overridepublic void onTabReselected(TabLayout.Tab tab) {}});mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {&#64;Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}&#64;Overridepublic void onPageSelected(int position) {mTabLayout.getTabAt(position).select();}&#64;Overridepublic void onPageScrollStateChanged(int state) {}});}
}

推荐阅读
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 微信小程序开发指南:创建动态电影选座界面
    本文详细介绍如何在微信小程序中实现一个动态且可视化的电影选座组件,提高用户体验。通过合理的布局和交互设计,使用户能够轻松选择心仪的座位。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 本文介绍了如何解决 ChinaASP.Upload 错误 '80040002',即必须添加版权信息的问题,并提供了详细的步骤和注意事项。 ... [详细]
author-avatar
百度地震姜常宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有