Android TabLayout 实现底部Tab的示例代码

作者:人言落日是天涯 时间:2023-09-16 12:21:17 

前言

底部Tab已经是一个应用的标配了,因为手机屏幕大小的限制,使得我们必须去最大化的利用可见的空间。当然底部Tab一般为3个左右,最多不会超过5个。

效果图

下面是我使用TabLayout来实现的底部Tab,

Android TabLayout 实现底部Tab的示例代码

实现方式也很简单,因为这里没有“小滑块”。只需要去处理,Tab的滑动和点击即可。

代码:


public class CustomBotTabItem {

private TabLayout mTabLayout;
 private ViewPager mViewPager;
 private Context mContext;
 //底部Tab标题
 private final String[] mTitles = {"主页", "理财", "添加", "消息", "我的"};
 //返回CustomBotTabItem实例
 public static CustomBotTabItem create() {
   return TabItemHolder.sCustomTabItem;
 }
 //创建CustomBotTabItem实例
 private static class TabItemHolder {
   private static CustomBotTabItem sCustomTabItem = new CustomBotTabItem();
 }
 //引入布局需要的Context
 public CustomBotTabItem setContext(Context context) {
   mContext = context;
   return this;
 }
 //需要自定义的TabLayout
 public CustomBotTabItem setTabLayout(TabLayout tabLayout) {
   mTabLayout = tabLayout;
   return this;
 }
 //设置与TabLayout关联的ViewPager
 public CustomBotTabItem setViewPager(ViewPager viewPager) {
   mViewPager = viewPager;
   return this;
 }
 //创建Tab
 public CustomBotTabItem build() {
   initTabLayout();
   return this;
 }
 //初始化Tab
 private void initTabLayout() {
   mTabLayout.setupWithViewPager(mViewPager);
   //第二个参数为selector,下同
   mTabLayout.getTabAt(0).setCustomView(getTabView(0, R.drawable.home_icon_selector));
   mTabLayout.getTabAt(1).setCustomView(getTabView(1, R.drawable.manage_icon_selector));
   mTabLayout.getTabAt(2).setCustomView(getTabView(2, R.drawable.add_icon_selector));
   mTabLayout.getTabAt(3).setCustomView(getTabView(3, R.drawable.find_icon_selector));
   mTabLayout.getTabAt(4).setCustomView(getTabView(4, R.drawable.money_icon_selector));
   tabSelectListener();
 }
  //自定义Tab样式
 private View getTabView(final int position, int resId) {
   final View view = LayoutInflater.from(mContext).inflate(R.layout.bottom_tab_item, null);
   TextView tvTitle = (TextView) view.findViewById(R.id.id_tv_title);
   final ImageView ivTitle = (ImageView) view.findViewById(R.id.id_iv_title);
   ivTitle.setImageResource(resId);
   tvTitle.setText(mTitles[position]);
   //默认第一个tab选中,设置字体为选中色
   if (position == 0) {
     tvTitle.setTextColor(Color.parseColor("#4192e3"));
   } else {
     tvTitle.setTextColor(Color.parseColor("#262a3b"));
   }
   //点击Tab切换
   view.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       mViewPager.setCurrentItem(position);
     }
   });
   return view;
 }
 //Tab监听
 private void tabSelectListener() {
   mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
     @Override
     public void onTabSelected(TabLayout.Tab tab) {
       changeTabStatus(tab, true);
     }

@Override
     public void onTabUnselected(TabLayout.Tab tab) {
       changeTabStatus(tab, false);
     }

@Override
     public void onTabReselected(TabLayout.Tab tab) {

}
   });
 }
 //切换Tab文字是否选中的的颜色
 private void changeTabStatus(TabLayout.Tab tab, boolean selected) {
   View view = tab.getCustomView();
   if (view == null) {
     return;
   }
   TextView tvTitle = (TextView) view.findViewById(R.id.id_tv_title);
   if (selected) {
     tvTitle.setTextColor(Color.parseColor("#4192e3"));
   } else {
     tvTitle.setTextColor(Color.parseColor("#262a3b"));
   }
 }
}

Activity 代码:


public class BottomTabLayoutActivity extends AppCompatActivity {
 private TabLayout mTabLayout;
 private ViewPager mViewPager;
 private List<Fragment> mFragmentList;

@Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_bot_tab_layout);
   findView();
   initFragmentList();
   setVpAdapter();
   CustomBotTabItem item = CustomBotTabItem.create();
   item.setContext(this)
       .setViewPager(mViewPager)
       .setTabLayout(mTabLayout)
       .build();
 }
 //findViewById
 private void findView() {
   mTabLayout = (TabLayout) findViewById(R.id.id_tab_layout);
   mViewPager = (ViewPager) findViewById(R.id.id_vp);
 }
 //初始化需要的Fragment
 private void initFragmentList() {
   mFragmentList = new ArrayList<>();
   mFragmentList.add(TabFragment.getInstance("主页"));
   mFragmentList.add(TabFragment.getInstance("理财"));
   mFragmentList.add(TabFragment.getInstance("添加"));
   mFragmentList.add(TabFragment.getInstance("消息"));
   mFragmentList.add(TabFragment.getInstance("我的"));
 }
 //设置ViewPager的Adapter
 private void setVpAdapter() {
   mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), mFragmentList, this));
 }
}

Activity.xml


<?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.support.design.widget.TabLayout
   android:id="@+id/id_tab_layout"
   android:layout_width="match_parent"
   android:layout_height="70dp"
   android:layout_alignParentBottom="true"
   android:background="#fff"
   android:fillViewport="false"
   app:layout_scrollFlags="scroll"
   app:tabIndicatorHeight="0dp"
   app:tabMode="fixed"
   >
 </android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager
   android:id="@+id/id_vp"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_above="@+id/id_tab_layout"
   />
</RelativeLayout>

来源:https://www.jianshu.com/p/3f4e62a113a8

标签:Android,底部,Tab
0
投稿

猜你喜欢

  • Android 实现调用系统照相机拍照和录像的功能

    2021-12-05 10:58:51
  • Android编程实现为ListView创建上下文菜单(ContextMenu)的方法

    2021-12-09 06:26:28
  • 基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例

    2022-06-24 08:07:48
  • Android自定义View实现五子棋小游戏

    2022-05-18 14:56:59
  • java日期时间操作工具类

    2022-09-03 13:04:58
  • 介绍C# 泛型类在使用中约束

    2023-06-23 21:39:40
  • winfrom 在业务层实现事务控制的小例子

    2021-11-16 14:19:50
  • c#打包文件解压缩的实例

    2022-07-22 11:20:20
  • C++语言io流处理基本操作教程示例

    2023-11-02 22:07:39
  • Java 用Prometheus搭建实时监控系统过程详解

    2023-09-06 12:07:40
  • 详解Android WebView加载html片段

    2023-04-23 11:40:12
  • @Async导致controller 404及失效原因解决分析

    2021-12-17 01:51:44
  • Android编程之ProgressBar圆形进度条颜色设置方法

    2022-03-11 15:26:25
  • Java启用Azure Linux虚拟机诊断设置

    2022-06-28 05:42:51
  • Java为什么占用四个字节你知道吗

    2021-06-16 18:05:22
  • IDEA中项目集成git提交代码的详细步骤

    2021-09-08 04:33:39
  • java设计模式之简单工厂模式详解

    2021-12-21 22:16:34
  • Maven打包jar生成javadoc文件和source文件代码实例

    2021-08-22 21:56:52
  • Java 守护线程_动力节点Java学院整理

    2023-11-28 07:51:14
  • android 软键盘的POPUP布局的问题解决

    2022-03-22 17:53:30
  • asp之家 软件编程 m.aspxhome.com