Android實現(xiàn)狀態(tài)欄切換功能匯總
項目開發(fā)過程中,特別是新開的項目,底部狀態(tài)欄的切換使用的頻率非常的高。
主要的實現(xiàn)方式有:
(1)、TabLayout + Fragment
(2)、FragmentTabHost + Fragment
(3)、BottomNavigationView + Fragment
(4)、RidioGroup + Fragment
這里我先介紹前面兩種實現(xiàn)方式,后面兩種后期再貼出實現(xiàn)方式。
一、使用TabLayout + Fragment + ViewPager實現(xiàn)
1、實現(xiàn)步驟:
(1)、布局文件中定義TabLayout控件
(2)、定義切換的每個Fragment布局文件
(3)、定義切換的每個Fragment的Java類
(4)、定義TabLayoutMainActivity類
(5)、效果圖演示
2、實現(xiàn)過程:
(1)、布局文件中定義TabLayout控件(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.showly.bottomnavigationbardemo.TabLayoutMainActivity"><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager_content_view"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:scrollbars="none" /><android.support.design.widget.TabLayoutandroid:id="@+id/tab_layout_view"android:layout_width="match_parent"android:layout_height="50dp"app:tabGravity="fill"app:tabIndicatorHeight="0dp"app:tabMode="fixed"app:tabSelectedTextColor="#FB8081"app:tabTextColor="#A0A0A0" /></LinearLayout>
(2)、定義切換的每個Fragment布局文件(fragment_frist.xml)
這里有四個Tab類別(首頁、娛樂、游戲、我的),布局都類似,這里只貼出其中一個
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="首頁"android:textColor="#000" /></RelativeLayout>
(3)、定義切換的每個Fragment的Java類(FristFragment.class)
這里的Java 類實現(xiàn)方式也相似,貼出其中一個
public class FristFragment extends Fragment {@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_frist, null);return view;}}
(4)、定義TabLayoutMainActivity類(TabLayoutMainActivity.class)
public class TabLayoutMainActivity extends AppCompatActivity {//未選中的Tab圖片private int[] unSelectTabRes = new int[]{R.drawable.i8live_menu_home_normal, R.drawable.i8live_menu_information_normal, R.drawable.i8live_menu_game_normal, R.drawable.i8live_menu_personl_normal};//選中的Tab圖片private int[] selectTabRes = new int[]{R.drawable.i8live_menu_home_press, R.drawable.i8live_menu_information_press, R.drawable.i8live_menu_game_press, R.drawable.i8live_menu_personl_press};//Tab標(biāo)題private String[] title = new String[]{"首頁", "娛樂", "游戲", "我的"};private ViewPager viewPager;private TabLayout tabLayout;private TabLayout.Tab tabAtOne;private TabLayout.Tab tabAttwo;private TabLayout.Tab tabAtthree;private TabLayout.Tab tabAtfour;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getSupportActionBar().hide();//隱藏掉整個ActionBarsetContentView(R.layout.activity_main);initView();initData();initListener();}private void initView() {viewPager = (ViewPager) findViewById(R.id.viewpager_content_view);tabLayout = (TabLayout) findViewById(R.id.tab_layout_view);//使用適配器將ViewPager與Fragment綁定在一起viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));//將TabLayout與ViewPager綁定tabLayout.setupWithViewPager(viewPager);/* //設(shè)置方式一://獲取底部的單個TabtabAtOne = tabLayout.getTabAt(0);tabAttwo = tabLayout.getTabAt(1);tabAtthree = tabLayout.getTabAt(2);tabAtfour = tabLayout.getTabAt(3);//設(shè)置Tab圖片tabAtOne.setIcon(R.drawable.i8live_menu_home_press);tabAttwo.setIcon(R.drawable.i8live_menu_information_normal);tabAtthree.setIcon(R.drawable.i8live_menu_game_normal);tabAtfour.setIcon(R.drawable.i8live_menu_personl_normal);*///設(shè)置方式二:for (int i = 0; i < title.length; i++) {if (i == 0) {tabLayout.getTabAt(0).setIcon(selectTabRes[0]);} else {tabLayout.getTabAt(i).setIcon(unSelectTabRes[i]);}}}private void initData() {}private void initListener() {//TabLayout切換時導(dǎo)航欄圖片處理tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {//選中圖片操作for (int i = 0; i < title.length; i++) {if (tab == tabLayout.getTabAt(i)) {tabLayout.getTabAt(i).setIcon(selectTabRes[i]);viewPager.setCurrentItem(i);}}}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {//未選中圖片操作for (int i = 0; i < title.length; i++) {if (tab == tabLayout.getTabAt(i)) {tabLayout.getTabAt(i).setIcon(unSelectTabRes[i]);}}}@Overridepublic void onTabReselected(TabLayout.Tab tab) {}});}//自定義適配器public class MyFragmentPagerAdapter extends FragmentPagerAdapter {public MyFragmentPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int position) {if (position == 1) {return new SecondFragment();//娛樂} else if (position == 2) {return new ThirtlyFragment();//游戲} else if (position == 3) {return new FourthlyFragment();//我的}return new FristFragment();//首頁}@Overridepublic int getCount() {return title.length;}@Overridepublic CharSequence getPageTitle(int position) {return title[position];}}}
(5)、效果圖演示

二、使用FragmentTabHost+ Fragment + ViewPager實現(xiàn)
1、實現(xiàn)步驟:
(1)、布局文件中定義FragmentTabHost控件
(2)、定義底部菜單欄布局
(3)、定義切換的每個Fragment布局文件
(4)、定義切換的每個Fragment的Java類
(5)、切換按鈕的圖片
(6)、定義FragmentTabHostMainActivity類
(7)、效果圖演示
2、實現(xiàn)過程:
(1)、布局文件中定義FragmentTabHost控件(fragment_tabhost_activity.xml)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"android:orientation="vertical"><android.support.v4.view.ViewPagerandroid:id="@+id/vp_pager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:scrollbars="none" /><android.support.v4.app.FragmentTabHostandroid:id="@android:id/tabhost"android:layout_width="match_parent"android:layout_height="65dp"android:background="#3000"><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="wrap_content"android:layout_height="wrap_content" /></android.support.v4.app.FragmentTabHost></LinearLayout>
(2)、定義底部菜單欄布局(tab_content.xml)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="2dp"><ImageViewandroid:id="@+id/iv_imageview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:background="@drawable/i8live_menu_home_normal" /><TextViewandroid:id="@+id/tv_item"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="5dp"android:text="首頁" /></LinearLayout>
(3)、定義切換的每個Fragment布局文件(fragment_frist.xml)
這里有四個Tab類別(首頁、娛樂、游戲、我的),布局都類似,這里只貼出其中一個
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="首頁"android:textColor="#000" /></RelativeLayout>
(4)、定義切換的每個Fragment的Java類(FristFragment.class)
這里的Java 類實現(xiàn)方式也相似,貼出其中一個
public class FristFragment extends Fragment {public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_frist, null);return view;}}
(5)、切換按鈕的圖片(tab_main.xml)
這里有四個是相似的,只貼出其中一個
<selector xmlns:android="http://schemas.android.com/apk/res/android"><!-- 切換選中之后的圖片--><itemandroid:drawable="@drawable/i8live_menu_home_press"android:state_selected="true" /><!-- 未選中的圖片--><item android:drawable="@drawable/i8live_menu_home_normal" /></selector>
(6)、定義FragmentTabHostMainActivity類
(FragmentTabHostMainActivity.class)
public class FragmentTabHostMainActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener {private int[] selectTabRes = new int[]{R.drawable.tab_main, R.drawable.tab_infomation, R.drawable.tab_game, R.drawable.tab_personal};//Tab標(biāo)題private String[] title = new String[]{"首頁", "娛樂", "游戲", "我的"};private Class fragmentArry[] = {FristFragment.class, SecondFragment.class, ThirtlyFragment.class, FourthlyFragment.class};private List<Fragment> fragmentList = new ArrayList();private ViewPager viewPager;private FragmentTabHost tabHost;protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_tabhost_activity);initView();initData();initListener();}/*** 初始化Fragment并給ViewPager添加適配器*/private void initVaper() {FristFragment fristFragment = new FristFragment();SecondFragment secondFragment = new SecondFragment();ThirtlyFragment thirtlyFragment = new ThirtlyFragment();FourthlyFragment fourthlyFragment = new FourthlyFragment();fragmentList.add(fristFragment);fragmentList.add(secondFragment);fragmentList.add(thirtlyFragment);fragmentList.add(fourthlyFragment);//ViewPager添加適配器viewPager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(), fragmentList));tabHost.getTabWidget().setDividerDrawable(null);}private void initView() {viewPager = (ViewPager) findViewById(R.id.vp_pager);tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);//綁定tabhosttabHost.setup(this, getSupportFragmentManager(), R.id.vp_pager);//TabHost綁定viewpager//獲取item的個數(shù)int count = title.length;for (int i = 0; i < count; i++) {//設(shè)置每個TabHost布局TabHost.TabSpec tabSpec = tabHost.newTabSpec(title[i]).setIndicator(getTabItemView(i));//item與fragment關(guān)聯(lián)tabHost.addTab(tabSpec, fragmentArry[i], null);tabHost.setTag(i);}//初始化TabHost文字顏色upDateTab(tabHost);//給ViewPager設(shè)置適配器initVaper();}/*** 更新文字顏色。** @param mTabHost*/private void upDateTab(FragmentTabHost mTabHost) {for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) {TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i).findViewById(R.id.tv_item);if (mTabHost.getCurrentTab() == i) {//選中tv.setTextColor(Color.parseColor("#FF5959"));} else {//不選中tv.setTextColor(Color.parseColor("#777777"));}}}/*** 設(shè)置每個Item布局*/private View getTabItemView(int i) {View view = LayoutInflater.from(this).inflate(R.layout.tab_content, null);ImageView itemImg = (ImageView) view.findViewById(R.id.iv_imageview);TextView itemText = (TextView) view.findViewById(R.id.tv_item);itemImg.setBackgroundResource(selectTabRes[i]);itemText.setText(title[i]);return view;}private void initData() {}private void initListener() {viewPager.addOnPageChangeListener(this);tabHost.setOnTabChangedListener(this);}public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}public void onPageSelected(int position) {TabWidget widget = tabHost.getTabWidget();int oldFocusability = widget.getDescendantFocusability();widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);//設(shè)置View覆蓋子類控件而直接獲得焦點tabHost.setCurrentTab(position);//根據(jù)位置Postion設(shè)置當(dāng)前的Tabwidget.setDescendantFocusability(oldFocusability);//設(shè)置取消分割線}public void onPageScrollStateChanged(int state) {}public void onTabChanged(String tabId) {int position = tabHost.getCurrentTab();viewPager.setCurrentItem(position);//把選中的Tab的位置賦給適配器,讓它控制頁面切換upDateTab(tabHost);//設(shè)置TabHost文字顏色}/*** 適配器*/public class MyFragmentAdapter extends FragmentPagerAdapter {List<Fragment> list;public MyFragmentAdapter(FragmentManager fm, List<Fragment> list) {super(fm);this.list = list;}public Fragment getItem(int position) {return list.get(position);}public int getCount() {return list.size();}}}
(7)、效果圖演示

三、總結(jié)
這兩種方式的實現(xiàn)已完成,實現(xiàn)起來相對還是比較簡單的,后期有時間會把后面兩種的實現(xiàn)方式補上。
需要源碼的童鞋在公眾號回復(fù)"底部狀態(tài)欄切換"即可獲取哦。
到這里就結(jié)束啦!
