【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 }