一,概述

之前我们使用ViewPager时,往往喜欢与TabPageIndicator配合使用,达到滑动就可以切换页面的效果.但是,TabPageIndicator毕竟是第三方库,多少还是没有谷歌推出的Tablayout好用.Tablayout出来后,估计之前在GitHub上类似的第三方控件都会沉寂下去了.Tablayout还有一个优点就是,它可以最低可以兼容到Android api2.2,这就很有吸引力了.本文主要是记录Tablayout+ViewPager+Fragment结合使用,搭建一个漂亮的app界面,小型项目可以直接使用!

二,代码实现

布局实现

1)Tablayout是在Android Support Design库,所有先去app/build.gradle添加该库

//使用TabLayout,需要引入design库compile 'com.android.support:design:25.1.0'

2)布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--titlebar--><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/myColor_green"android:padding="8dp"><TextViewandroid:id="@+id/home_tv_qrcode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:background="@drawable/qr_code"/><TextViewandroid:id="@+id/home_tv_category"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:background="@drawable/category"/><TextViewandroid:id="@+id/home_tv_search"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_toLeftOf="@id/home_tv_category"android:layout_toRightOf="@id/home_tv_qrcode"android:background="@drawable/bg_home_edittext"android:gravity="center"android:padding="6dp"android:text="@string/text_tv_search"android:textColor="@color/black_cdcdcd"android:textSize="16sp"/></RelativeLayout><!--tablayout的背景颜色: android:background="#38B059"--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><android.support.design.widget.TabLayoutandroid:background="@color/colorPrimary"android:id="@+id/home_tablayout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabGravity="fill"app:tabIndicatorColor="@color/myColor_green"app:tabMode="scrollable"app:tabSelectedTextColor="@color/myColor_green"app:tabTextColor="@color/pale_black"/><android.support.v4.view.ViewPagerandroid:id="@+id/home_viewpager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout></LinearLayout><!--设置fab的背景颜色app:backgroundTint="@color/myColor_green"--><android.support.design.widget.FloatingActionButtonandroid:id="@+id/home_fabtn_settings"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:layout_marginBottom="@dimen/size_dp14"android:layout_marginRight="@dimen/size_dp14"android:src="@drawable/icon_setting"app:backgroundTint="@color/myColor_green"app:rippleColor="@color/colorAccent"/>
</RelativeLayout>

3)关于Tablayout的几个属性

background: 设置背景图,示例为#38B059

tabTextColor: tab 的字体颜色,示例为#7D&D&D

tabSelectedTextColor: tab 选中时候的字体颜色

tabMode: tab 的模式,有两种。fixed 为固定模式,scrollable 为可滚动模式

程序代码实现

1)HomeUI.java的所有代码

public class HomeUI extends BaseActivity implements View.OnClickListener {private TabLayout mTabLayout;private ViewPager mViewPager;private FloatingActionButton mFabtnSettings;//悬浮按钮/*** title list*/private List<String> mTitleLists;/*** fragment list*/private List<Fragment> mFragLists;private TextView mQrCode;//二维码@Overrideprotected void setContentView() {setContentView(R.layout.ui_home);//changeStatusBarColor(R.color.myColor_green);//隐藏actionbargetSupportActionBar().hide();}@Overrideprotected void initView() {mTabLayout = (TabLayout) findViewById(R.id.home_tablayout);mViewPager = (ViewPager) findViewById(R.id.home_viewpager);mFabtnSettings = (FloatingActionButton) findViewById(R.id.home_fabtn_settings);mQrCode = (TextView) findViewById(R.id.home_tv_qrcode);}@Overrideprotected void initData() {//默认隐藏mFabtnSettings.setVisibility(ViewPager.GONE);//去掉阴影getSupportActionBar().setElevation(0);mTitleLists = new ArrayList<>();mTitleLists.add("语音助手");mTitleLists.add("微信精选");mTitleLists.add("视频推荐");mTitleLists.add("创意商品");mTitleLists.add("个人中心");mFragLists = new ArrayList<>();mFragLists.add(new HelperFrag());mFragLists.add(new WechatFrag());mFragLists.add(new VideoFrag());mFragLists.add(new GoodsFrag());mFragLists.add(new UserFrag());//viewpager预加载mViewPager.setOffscreenPageLimit(mFragLists.size());//监听ViewPagermViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {//在第一个ViewPager中隐藏,其他页面显示mFabtnSettings.setVisibility((position == 0) ? ViewPager.GONE : ViewPager.VISIBLE);}@Overridepublic void onPageScrollStateChanged(int state) {}});//设置适配器mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {@Overridepublic Fragment getItem(int position) {//返回当前位置的页面return mFragLists.get(position);}@Overridepublic int getCount() {//总的页面数return mFragLists.size();}@Overridepublic CharSequence getPageTitle(int position) {//每个item的titlereturn mTitleLists.get(position);}});/*** 绑定*/mTabLayout.setupWithViewPager(mViewPager);//跳转到悬浮按钮设置界面mFabtnSettings.setOnClickListener(this);//跳转到扫码页面mQrCode.setOnClickListener(this);}@Overrideprotected void showBackKey() {//主页不显示返回的按钮//super.showBackKey();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.home_fabtn_settings:IntentUtils.startActivity(this, UserSettingUI.class);showNext();break;default:break;}}}

2)HomeUI继承自BaseActivity,BaseActivity是自定义的Activity基类,继承自该基类的Activity默认就要实现setContentView() initView() initData()三个方法,作用分别为加载布局文件 获取id 初始化一些数据.

3)标题与需要绑定的Fragment最好是用一个JavaBean来封装数据,如FragmentInfo.java,如下:

public class FragmentInfo {private  String title;private Class fragment;public FragmentInfo(String title, Class fragment) {this.title = title;this.fragment = fragment;}//setter与getter方法省略
}

本文为了方便,分别用集合来存标题和Fragment实例,如下:

 mTitleLists = new ArrayList<>();mTitleLists.add("语音助手");mTitleLists.add("微信精选");mTitleLists.add("视频推荐");mTitleLists.add("创意商品");mTitleLists.add("个人中心");mFragLists = new ArrayList<>();mFragLists.add(new HelperFrag());mFragLists.add(new WechatFrag());mFragLists.add(new VideoFrag());mFragLists.add(new GoodsFrag());mFragLists.add(new UserFrag());

4)为了提高效率,进行了ViewPager的预加载.

mViewPager.setOffscreenPageLimit(mFragLists.size());

5)实际开发中最好另外写一个适配器类,将代码分析,而不是通过匿名内部类的方式

  //设置适配器mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {@Overridepublic Fragment getItem(int position) {//返回当前位置的页面return mFragLists.get(position);}@Overridepublic int getCount() {//总的页面数return mFragLists.size();}@Overridepublic CharSequence getPageTitle(int position) {//每个item的titlereturn mTitleLists.get(position);}});

6)接下来就是Tablayout绑定ViewPager了

 /*** 绑定*/mTabLayout.setupWithViewPager(mViewPager);

三,效果图

效果图如下,可以自然的滑动滑动切换页面哦,个人感觉还不错!嘻嘻!

Android进阶之利用Tablayout+ViewPager+Fragment实现神奇的滑动效果相关推荐

  1. SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+RecyclerView 刷新,不能滑动等问题

    使用SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+Fragment+RecyclerView 实现首页悬浮 ...

  2. Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment)

    Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment) 文章目录 Android实现一个简易的新闻列表APP(TabLayout+ViewPager+F ...

  3. TabLayout+ViewPager+Fragment实现切页展示

    写在前面 目前大多数的APP都采用的是几个Tab标签以及多个界面滑动的形式来提供多层次的交互体验,最为常用的做法就是采用TabLayout+ViewPager+Fragment的方式,最近在公司项目中 ...

  4. TabLayout+Viewpager+Fragment实现分页滚动

    效果如上,顶部标签滚动底下的页面也跟着滚动 灰色的标签只是一个recyclerview装起来的 这里用TabLayout+Viewpager+Fragment实现 先看布局 <?xml vers ...

  5. TabLayout+ViewPager+Fragment(内部:TabLayout+ViewPager+ Fragment)需要注意!!

    之前面试的时候,被面试官问道ViewPager嵌套ViewPager怎么处理的.我还一直在回答用最外层的vp的onInterceptTouchEvent来处理怎样怎样(注意是代码没有写过,就这样说了. ...

  6. 使用TabLayout+ViewPager+Fragment实现切页展示

    使用TabLayout+ViewPager+Fragment是比较常见的实现切页展示的方式,本例是在fragment中实现主要代码 步骤: 1,定义TabLayout和ViewPager的布局 2,实 ...

  7. 小牛的安卓笔记-----底部导航栏的实现以及用TabLayout+ViewPager+Fragment实现页面滑动切换

    昨夜西风凋碧树,独上高楼,望尽天涯路. 今天难得有时间,准备写一写我们在APP中经常用到的页面形式,废话不多说,直接一张图看看页面效果你就知道为啥是常用的页面形式.先看看逻辑和最后的效果是怎么样的: ...

  8. TabLayout+ViewPager+Fragment中Fragment的可见和不可见问题

    场景 TabLayout+ViewPager+Fragment的使用过程中需要判断Fragment是否对用户可见,监听Fragment由不可见变为可见的事件 解决方案 重写Fragment的setUs ...

  9. Tablayout+ViewPager+Fragment 实现页面切换

    项目也快上线了,就来总结下Tablayout+ViewPager+Fragment 的使用啦 主activity public class DoSomethingAct extends BaseAct ...

  10. android左右滑动fragment,Android基于ViewPager+Fragment实现左右滑屏效果的方法

    本文实例讲述了Android基于ViewPager+Fragment实现左右滑屏效果的方法.分享给大家供大家参考,具体如下: 1.xml布局模板 android:id="@+id/local ...

最新文章

  1. UI设计培训分享:ui的字体怎么正确设置?
  2. 30分钟从工作电脑入侵公司内网!Win11:更新强制要求有TPM2.0,知道为啥了吧?...
  3. 「测评」酷炫“霸王龙”Miposaur机器人测评
  4. Linux文件系统目录
  5. 【Android】Android程序自己主动更新
  6. 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)
  7. 退出所有循环_Python学习之路9—循环的总结
  8. Smokeping的参数使用说明
  9. linux中脚本循环语句,Shell脚本循环语句
  10. 群同态基本定理证明_自由群的定义及相关
  11. 生成式模型(generative) vs 判别式模型(discriminative)
  12. coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网
  13. echart的基本使用方法
  14. 形式化方法 Assignment 4: Proof for predicate logic
  15. zabbix web监控 一: zabbix3.2添加web页面监控(Web monitoring)
  16. ES学习构建EKL海量日志分析平台
  17. python3.9安装numpy+mky_各种转码(bytes、string、base64、numpy array、io、BufferedReader )...
  18. ES中如何实现随机抽样查询
  19. ZOOM一直显示登录失败,出现Zoom登录失败:100000503,zoom登录失败错误代码1044
  20. ROsalind 014 Finding a Shared Motif

热门文章

  1. 转: DH密钥交换和ECDH原理
  2. 柳传志:如何看人和用人
  3. 让hammer完美支持Pixi.js - 2D webG库
  4. ArcEngine 相关-转载
  5. 关于 tag import 和 page import
  6. js-数据类型和变量
  7. 14.PHP核心技术与最佳实践 --- PHP 编码规范
  8. 5.Nginx 反向代理
  9. 3. static file process
  10. 《数学之美》—图论和网络爬虫