Android底部导航栏(可滑动)----TabLayout+viewPager
【TabLayout】
①TabLayout是选项卡,在屏幕空间有限的情况下,对不同的空间进行分组。属于android support design,更多的用于新闻上,如果放在底部也可做底部导航栏
②TabLayout的选项卡模式有两种:fixed;scrollable;
tabLayout.setTabMode(TabLayout.MODE_FIXED);设置选项卡模式为fixed
tabSelectedTextColor:选中时,字的颜色,适用于tabItem的普通模式;
tabIndicatorHeight:设置指示器的高度,如果为0表示没有指示器,适用于tabItem的普通模式;(在作为底部导航时,需隐藏指示器)
tabIndicatorColor:设置指示器颜色,适用于tabItem的普通模式;
🌂设置Tab页的自定义View
TabLayout.getTabAt(index).setCustomView(view);
🐖如果无需自定义View
可重写ViewPagerAdapter(绑定当前页面viewPager的Adapter类)中的方法 getPageTitle
@Override
public CharSequence getPageTitle(int position) {
return titleList[position];
}
//准备titleList数据为Tab页的标题
String[] titleList = new String[]{"A","B","C"};
④与ViewPager结合
TabLayout.setUpWithViewPager(viewPager);
😭TabLayouit的Tab切换事件
onTabselectedListener事件{
该事件(接口)包含多个回调(callback)方法:
void onTabSelected(TabLayout.Tab tab):
选中某一个选项;
void onTabUnSelected(TabLayout.Tab tab):
放弃选中某一个选项;
void onTabReSelected(TabLayout.Tab tab):
已选择,再次选中这个选项
}
⑥此处作为底部导航栏
<1>、设置选项卡模式为fixed
tabLayout.setTabMode(TabLayout.MODE_FIXED);
<2>、隐藏下方的指示条
tabLayout.setSelectedTabIndicatorHeight(0);
<3>、重写tabLayout的选项卡点击事件
在选中时可对底部图片进行变色或更换图片处理,将选中的Tab视图突出显示。将未选中的标签进行还原
注:另外此项目使用butterKnife,详情请参考 【butterKnite的使用】
【效果】
【项目结构】
【步骤】
①添加design依赖(build.gradle)
implementation 'com.android.support:design:27.1.1'
②activity_main_nav.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".MainNavActivity"
8 android:orientation="vertical">
9 <android.support.v4.view.ViewPager
10 android:id="@+id/viewPager"
11 android:layout_width="match_parent"
12 android:layout_height="0dp"
13 android:layout_weight="1">
14
15 </android.support.v4.view.ViewPager>
16
17 <android.support.design.widget.TabLayout
18 android:id="@+id/tabLayout"
19 android:background="@color/blackBg"
20 android:layout_width="match_parent"
21 android:layout_height="?attr/actionBarSize"
22 android:scrollIndicators="none"
23 >
24
25 </android.support.design.widget.TabLayout>
26
27 </LinearLayout>
🌂创建底部的自定义布局main_tab_item.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 android:layout_width="match_parent"
5 android:layout_weight="1"
6 android:layout_height="wrap_content"
7 android:orientation="vertical"
8 android:background="@color/blackBg">
9
10 <ImageView
11 android:id="@+id/ivTab"
12 android:layout_width="40dp"
13 android:layout_height="40dp"
14 android:layout_gravity="center"
15 android:padding="5sp"
16 android:scaleType="fitCenter"
17 android:src="@mipmap/ic_launcher"
18 />
19 <TextView
20 android:id="@+id/tvTab"
21 android:layout_width="match_parent"
22 android:layout_height="wrap_content"
23 android:gravity="center"
24 android:textColor="@color/writeTx"
25 android:text="聊天"
26 android:textSize="12sp"/>
27
28 </LinearLayout>
④新建四个Fragment待使用
😭准备四个底部图标
⑥添加MainPageAdapter.java将四个fragment绑定到viewPager上
1 public class MainPageAdpater extends FragmentPagerAdapter {
2
3 List<Fragment> fragmentList = null;
4
5 public MainPageAdpater(FragmentManager fm) {
6 super(fm);
7 }
8
9 public MainPageAdpater(FragmentManager fm, List<Fragment> fragmentList) {
10 super(fm);
11 this.fragmentList = fragmentList;
12 }
13
14 @Override
15 public Fragment getItem(int position) {
16 return fragmentList.get(position);
17 }
18
19 @Override
20 public int getCount() {
21 return fragmentList.size();
22 }
23
24 }
⑦修改MainNavActivity.class
1 public class MainNavActivity extends AppCompatActivity {
2
3 @BindView(R.id.viewPager)
4 ViewPager viewPager;
5 @BindView(R.id.tabLayout)
6 TabLayout tabLayout;
7
8 @Override
9 protected void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState);
11 setContentView(R.layout.activity_main_nav);
12 ButterKnife.bind(this);
13
14 //初始化底部导航
15 initBottomNav();
16 }
17
18 int[] ivTabs;
19 String[] tvTabs;
20 //底部导航
21 private void initBottomNav() {
22 List<Fragment> fragmentList = new ArrayList<>();
23 fragmentList.add(new ChatFragment());
24 fragmentList.add(new ContactFragment());
25 fragmentList.add(new FindFragment());
26 fragmentList.add(new MeFragment());
27 viewPager.setAdapter(new MainPageAdpater(getSupportFragmentManager(),fragmentList));
28 tabLayout.setupWithViewPager(viewPager);
29 tabLayout.setTabMode(TabLayout.MODE_FIXED);
30
31 ivTabs = new int[]{R.drawable.chat,R.drawable.contact,R.drawable.find,R.drawable.me};
32 tvTabs = new String[]{"聊天","通讯录","发现","我的"};
33
34 for (int i = 0; i < fragmentList.size(); i++) {
35 View view = LayoutInflater.from(this).inflate(R.layout.main_tab_item, null, false);
36 ImageView ivTab=view.findViewById(R.id.ivTab);
37 TextView tvTab=view.findViewById(R.id.tvTab);
38
39 ivTab.setImageResource(ivTabs[i]);
40 tvTab.setText(tvTabs[i]);
41 if (i==0){
42 ivTab.setColorFilter(Color.GREEN);
43 tvTab.setTextColor(Color.GREEN);
44 }
45 tabLayout.getTabAt(i).setCustomView(view);
46 }
47 tabLayout.setSelectedTabIndicatorHeight(0);
48 tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
49 @Override
50 public void onTabSelected(TabLayout.Tab tab) {
51 View customView = tab.getCustomView();
52 ImageView iv = customView.findViewById(R.id.ivTab);
53 TextView tv = customView.findViewById(R.id.tvTab);
54 iv.setColorFilter(Color.GREEN);
55 tv.setTextColor(Color.GREEN);
56 }
57
58 @Override
59 public void onTabUnselected(TabLayout.Tab tab) {
60 View customView = tab.getCustomView();
61 ImageView iv = customView.findViewById(R.id.ivTab);
62 TextView tv = customView.findViewById(R.id.tvTab);
63 iv.setColorFilter(Color.WHITE);
64 tv.setTextColor(Color.WHITE);
65 }
66
67 @Override
68 public void onTabReselected(TabLayout.Tab tab) {
69
70 }
71 });
72
73 }
74
75 }