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 }

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM