ANDROID BottomNavigationBar底部導(dǎo)航欄的實(shí)現(xiàn)示例
第一種介紹的就是使用開(kāi)源庫(kù),因?yàn)槭褂瞄_(kāi)源庫(kù)最簡(jiǎn)單,也更加的符合我們的審美標(biāo)準(zhǔn),同時(shí)BottomNavigationBar還是符合當(dāng)前的Material Design標(biāo)準(zhǔn)的。
效果展示
依賴(lài)
compile'com.ashokvarma.android:bottom-navigation-bar:1.2.0'
布局文件
activity_main.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"> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <com.ashokvarma.bottomnavigation.BottomNavigationBar android:id="@+id/bottom_navigation_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom"/> </LinearLayout>
對(duì)于下面將要使用到四個(gè)Fragment里面的布局文件
1.fragment_index.xml
2.fragment_map.xml
3.fragment_love.xml
4.fragment_person.xml
只需要將其中的android:text屬性中的內(nèi)容進(jìn)行修改以做區(qū)分
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <TextView android:text="主頁(yè)" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
Java代碼
public class MainActivity extends AppCompatActivity implements BottomNavigationBar.OnTabSelectedListener { BottomNavigationBar mBottomNavigationBar; private IndexFragment indexFragment; private MapFragment mapFragment; private LoveFragment loveFragment; private PersonFragment personFragment; private BadgeItem badgeItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initBadge(); setDefaultFragment(); InitNavigationBar(); } private void InitNavigationBar() { mBottomNavigationBar = (BottomNavigationBar)findViewById(R.id.bottom_navigation_bar); mBottomNavigationBar.setTabSelectedListener(this); mBottomNavigationBar.setMode(BottomNavigationBar.MODE_SHIFTING); mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_RIPPLE); mBottomNavigationBar .addItem(new BottomNavigationItem(R.drawable.icon_index,"首頁(yè)").setActiveColorResource(R.color.red)) .addItem(new BottomNavigationItem(R.drawable.icon_map,"地圖").setActiveColorResource(R.color.blue)) .addItem(new BottomNavigationItem(R.drawable.icon_love,"關(guān)注").setActiveColorResource(R.color.yellow).setBadgeItem(badgeItem)) .addItem(new BottomNavigationItem(R.drawable.icon_person,"個(gè)人").setActiveColorResource(R.color.green)) .setFirstSelectedPosition(0) .initialise(); } public void initBadge() { badgeItem = new BadgeItem() .setBorderWidth(2) .setBorderColor("#ff0000") .setBackgroundColor("#ff0000") .setGravity(Gravity.RIGHT| Gravity.TOP) .setText("2") .setTextColor("#ffffff") .setAnimationDuration(2000) .setHideOnSelect(true); } private void setDefaultFragment() { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); indexFragment = new IndexFragment(); transaction.replace(R.id.fragment_container, indexFragment); transaction.commit(); } @Override public void onTabSelected(int position) { Log.d("onTabSelected", "onTabSelected: " + position); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); switch (position) { case 0: if (indexFragment == null) { indexFragment = new IndexFragment(); } transaction.replace(R.id.fragment_container, indexFragment); break; case 1: if (mapFragment== null) { mapFragment = new MapFragment(); } transaction.replace(R.id.fragment_container, mapFragment); break; case 2: if (loveFragment == null) { loveFragment = new LoveFragment(); } transaction.replace(R.id.fragment_container,loveFragment); break; case 3: if (personFragment == null) { personFragment = new PersonFragment(); } transaction.replace(R.id.fragment_container,personFragment); break; default: break; } // 事務(wù)提交 transaction.commit(); } @Override public void onTabUnselected(int position) { Log.d("onTabUnselected", "onTabUnselected: " + position); } @Override public void onTabReselected(int position) { Log.d("onTabReselected", "onTabReselected: " + position); } }
代碼分析
1.初始化導(dǎo)航條樣式
對(duì)于Mode和BackgroundStyle各有3種選擇
Mode
- 在xml代碼使用android:bnbMode屬性
- 在Java代碼中使用setMode方法
MODE_DEFAULT:如果Item的個(gè)數(shù)<=3就會(huì)使用MODE_FIXED模式,否則使用MODE_SHIFTING模式。
MODE_FIXED:填充模式,未選中的Item會(huì)顯示文字,沒(méi)有換擋動(dòng)畫(huà)。
MODE_SHIFTING:換擋模式,未選中的Item不會(huì)顯示文字,選中的會(huì)顯示文字。在切換的時(shí)候會(huì)有一個(gè)像換擋的動(dòng)畫(huà)。
BackgroundStyle
- 在xml代碼使用android:bnbBackgroundStyle屬性
- 在Java代碼中使用setBackgroundStyle方法
BACKGROUND_STYLE_DEFAULT:如果設(shè)置的Mode為MODE_FIXED,將使用BACKGROUND_STYLE_STATIC 。如果Mode為MODE_SHIFTING將使用BACKGROUND_STYLE_RIPPLE。
BACKGROUND_STYLE_STATIC:點(diǎn)擊的時(shí)候沒(méi)有水波紋效果
BACKGROUND_STYLE_RIPPLE:點(diǎn)擊的時(shí)候有水波紋效果
2.初始化導(dǎo)航條條目
需要幾個(gè)就添加幾個(gè),包含圖片和圖片下方代表的文字以及設(shè)定被選中時(shí)產(chǎn)生效果的顏色。
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.icon_index,"首頁(yè)").setActiveColorResource(R.color.red));
3.初始化Badge
badgeItem = new BadgeItem().setBorderWidth(2)//邊框?qū)挾? .setBorderColor("#ff0000")//邊框顏色 .setBackgroundColor("#ff0000")//背景顏色 .setGravity(Gravity.RIGHT| Gravity.TOP)//顯示位置 .setText("2")//顯示文字 .setTextColor("#ffffff")//文字顏色 .setAnimationDuration(2000)//漸退、漸出的時(shí)間 .setHideOnSelect(true);//選中時(shí)是否消失
然后為特定需要設(shè)置Badge的條目設(shè)置上
mBottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.icon_love,"關(guān)注").setActiveColorResource(R.color.yellow).setBadgeItem(badgeItem));
4.初始化Fragment
在activity_main.xml當(dāng)中有一個(gè)FrameLayout,這個(gè)需要當(dāng)導(dǎo)航條條目發(fā)生改變時(shí),對(duì)應(yīng)著發(fā)生改變。
setDefaultFragment():當(dāng)活動(dòng)打開(kāi)時(shí),事先顯示哪個(gè)fragment
FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); indexFragment = new IndexFragment(); transaction.replace(R.id.fragment_container, indexFragment); transaction.commit();
下面則為下面的導(dǎo)航條目綁定監(jiān)聽(tīng)事件
mBottomNavigationBar.setTabSelectedListener(this);
onTabSelected():當(dāng)選中的導(dǎo)航條目發(fā)生改變時(shí)
FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); switch (position) { case 0: if (indexFragment == null) { indexFragment = new IndexFragment(); } transaction.replace(R.id.fragment_container, indexFragment); break; case 1: if (mapFragment== null) { mapFragment = new MapFragment(); } transaction.replace(R.id.fragment_container, mapFragment); break; case 2: if (loveFragment == null) { loveFragment = new LoveFragment(); } transaction.replace(R.id.fragment_container,loveFragment); break; case 3: if (personFragment == null) { personFragment = new PersonFragment(); } transaction.replace(R.id.fragment_container,personFragment); break; default: break; } // 事務(wù)提交 transaction.commit();
總結(jié)
代碼和解析都在上方,初學(xué)者一定要仔細(xì)的使用,方能很好的掌握。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android10 App啟動(dòng)Activity源碼分析
這篇文章主要為大家介紹了Android10 App啟動(dòng)Activity源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Android LayoutTransiton實(shí)現(xiàn)簡(jiǎn)單的錄制按鈕
這篇文章主要介紹了Android LayoutTransiton實(shí)現(xiàn)簡(jiǎn)單的錄制按鈕,主要實(shí)現(xiàn)開(kāi)始,暫停,停止和顯示錄制時(shí)間長(zhǎng)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android 自定義View實(shí)現(xiàn)單擊和雙擊事件的方法
下面小編就為大家?guī)?lái)一篇Android 自定義View實(shí)現(xiàn)單擊和雙擊事件的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09ionic監(jiān)聽(tīng)android返回鍵實(shí)現(xiàn)“再按一次退出”功能
本篇文章主要介紹了ionic監(jiān)聽(tīng)android返回鍵實(shí)現(xiàn)“再按一次退出”功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-02-02Android UI設(shè)計(jì)系列之自定義ListView仿QQ空間阻尼下拉刷新和漸變菜單欄效果(8)
這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義ListView仿QQ空間阻尼下拉刷新和漸變菜單欄效果,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06詳解Android首選項(xiàng)框架的使用實(shí)例
首選項(xiàng)這個(gè)名詞對(duì)于熟悉Android的朋友們一定不會(huì)感到陌生,它經(jīng)常用來(lái)設(shè)置軟件的運(yùn)行參數(shù)。本篇文章主要介紹詳解Android首選項(xiàng)框架的使用實(shí)例,有興趣的可以了解一下。2016-11-11Android中的深度鏈接技術(shù)實(shí)戰(zhàn)
本文主要介紹了Android中的深度鏈接技術(shù)實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Android Studio和Gradle使用不同位置JDK的問(wèn)題解決
這篇文章主要介紹了Android Studio和Gradle使用不同位置JDK的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Android自定義View實(shí)現(xiàn)自動(dòng)吸附功能
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)自動(dòng)吸附功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01