Android底部導航欄BottomBar

一、添加依賴

    //BottomBar
    implementation 'com.roughike:bottom-bar:2.3.1'

二精肃、創(chuàng)建一個res/xml/bottombar_tabs.xml

<?xml version="1.0" encoding="utf-8"?>
<tabs>
    <tab
        id="@+id/tab_home"
        icon="@drawable/ic_tab_home"
        title="@string/main_home" />
    <tab
        id="@+id/tab_category"
        icon="@drawable/ic_tab_category"
        title="@string/main_category" />
    <tab
        id="@+id/tab_cart"
        icon="@drawable/ic_tab_cart"
        title="@string/main_shopping_cart"/>
    <tab
        id="@+id/tab_mine"
        icon="@drawable/ic_tab_mine"
        title="@string/main_mine" />
</tabs>

三、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=".ui.MainActivity">

    <FrameLayout
        android:id="@+id/fl_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <com.roughike.bottombar.BottomBar
        android:id="@+id/bottom_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/size_54"
        android:background="@android:color/white"
        app:bb_activeTabColor="@color/colorFDD835"
        app:bb_inActiveTabColor="@color/color737373"
        app:bb_showShadow="false"
        app:bb_tabXmlResource="@xml/bottombar_tabs" />


    <!--app:bb_activeTabColor   選中的Tab顏色-->
    <!--bb_inActiveTabColor     未選中的Tab顏色-->
    <!--bb_showShadow           是否是平板模式-->
    <!--bb_tabXmlResource       tab的xml文件-->
    <!--bb_badgeBackgroundColor 設置Badges的背景色变过,就是右上角顯示數(shù)字那個-->
    <!--bb_badgesHideWhenActive 小紅點是否隱藏崩泡,默認為 true 隱藏晰甚。就是右上角顯示數(shù)字那個-->
</LinearLayout>

四柴罐、MainActivity代碼

package com.example.demo.ui;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import com.example.demo.R;
import com.example.demo.base.BaseActivity;
import com.example.demo.presenter.HomrPresenter;
import com.example.demo.ui.cart.fragment.CartFragment;
import com.example.demo.ui.category.fragment.CategoryFragment;
import com.example.demo.ui.home.fragment.HomeFragment;
import com.example.demo.ui.mine.fragment.MineFragment;
import com.example.demo.view.HomeView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnTabSelectListener;

import butterknife.BindView;

public class MainActivity extends BaseActivity<EmptyPresenter, EmptyView> implements OnTabSelectListener {

    @BindView(R.id.bottom_bar)
    BottomBar bottomBar;
    private HomeFragment mHomeFragment;
    private CategoryFragment mCategoryFragment;
    private CartFragment mCartFragment;
    private MineFragment mMineFragment;

    // 當前正在顯示的Fragment
    private Fragment mCurrentFragment;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    protected EmptyPresenter initPresenter() {
        return new EmptyPresenter();
    }

    @Override
    protected void initView() {
        // "內(nèi)存重啟"時(例如修改手機字體大小), 恢復之前的Fragment.
        // 注意此方法只有在父類的onCreate(Bundle)調(diào)用之后才有效.
        retrieveFragments();
        bottomBar.setOnTabSelectListener(this);
    }

    @Override
    public void onBackPressed() {
        if (mCurrentFragment != mHomeFragment) {
            // 如果不是在HomeFragment, 則按返回鍵回到HomeFragment
            bottomBar.selectTabWithId(R.id.tab_home);
            return;
        }
        // 將Activity所在的Task移到后臺, 而不是finish此Activity
        moveTaskToBack(true);
    }

    /**
     * 首頁4個Fragment切換, 使用hide和show, 而不是replace.
     *
     * @param target 要顯示的目標Fragment.
     */
    private void switchFragments(Fragment target) {
        if (mCurrentFragment == target) return;
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (mCurrentFragment != null) {
            // 隱藏當前正在顯示的Fragment
            transaction.hide(mCurrentFragment);
        }
        if (target.isAdded()) {
            // 如果目標Fragment已經(jīng)添加過,就顯示它
            transaction.show(target);
        } else {
            // 否則直接添加該Fragment
            transaction.add(R.id.fl_container, target, target.getClass().getName());
        }
        transaction.commit();
        mCurrentFragment = target;
    }

    /**
     * 找回FragmentManager中存儲的Fragment
     */
    private void retrieveFragments() {
        FragmentManager manager = getSupportFragmentManager();
        mHomeFragment = (HomeFragment) manager.findFragmentByTag(HomeFragment.class.getName());
        mCategoryFragment = (CategoryFragment) manager.findFragmentByTag(CategoryFragment.class.getName());
        mCartFragment = (CartFragment) manager.findFragmentByTag(CartFragment.class.getName());
        mMineFragment = (MineFragment) manager.findFragmentByTag(MineFragment.class.getName());
    }

    /**
     * Tab的選中事件
     */
    @Override
    public void onTabSelected(int tabId) {
        switch (tabId) {
            case R.id.tab_home:// 首頁
                if (mHomeFragment == null) mHomeFragment = HomeFragment.newInstance();
                switchFragments(mHomeFragment);
                break;
            case R.id.tab_category:// 分類
                if (mCategoryFragment == null) mCategoryFragment = CategoryFragment.newInstance();
                switchFragments(mCategoryFragment);
                break;
            case R.id.tab_cart:// 購物車
                if (mCartFragment == null) mCartFragment = CartFragment.newInstance();
                switchFragments(mCartFragment);
                break;
            case R.id.tab_mine:// 我的
                if (mMineFragment == null) mMineFragment = MineFragment.newInstance();
                switchFragments(mMineFragment);
                break;
            default:
                throw new UnsupportedOperationException("Illegal branch!");
        }
    }
}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墨缘,一起剝皮案震驚了整個濱河市袁滥,隨后出現(xiàn)的幾起案子盖桥,更是在濱河造成了極大的恐慌,老刑警劉巖呻拌,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葱轩,死亡現(xiàn)場離奇詭異,居然都是意外死亡藐握,警方通過查閱死者的電腦和手機靴拱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猾普,“玉大人袜炕,你說我怎么就攤上這事〕跫遥” “怎么了偎窘?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溜在。 經(jīng)常有香客問我陌知,道長,這世上最難降的妖魔是什么掖肋? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任仆葡,我火速辦了婚禮,結果婚禮上志笼,老公的妹妹穿的比我還像新娘沿盅。我一直安慰自己把篓,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布腰涧。 她就那樣靜靜地躺著韧掩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窖铡。 梳的紋絲不亂的頭發(fā)上疗锐,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音万伤,去河邊找鬼窒悔。 笑死,一個胖子當著我的面吹牛敌买,可吹牛的內(nèi)容都是我干的简珠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼虹钮,長吁一口氣:“原來是場噩夢啊……” “哼聋庵!你這毒婦竟也來了?” 一聲冷哼從身側響起芙粱,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祭玉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后春畔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脱货,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年律姨,在試婚紗的時候發(fā)現(xiàn)自己被綠了振峻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡择份,死狀恐怖扣孟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荣赶,我是刑警寧澤凤价,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拔创,受9級特大地震影響利诺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜剩燥,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一立轧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦氛改、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赁项,卻和暖如春葛躏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悠菜。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工舰攒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悔醋。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓摩窃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芬骄。 傳聞我的和親對象是個殘疾皇子猾愿,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,426評論 0 17
  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone閱讀 929評論 0 1
  • 項目中經(jīng)常用到的一個模塊账阻,有需要自己get喲5倜亍!淘太! 二話不說先上圖姻僧,沒圖說個cz!F涯痢撇贺! 如果有幫到你,那么請繼續(xù)造成!...
    不朽大叔丶閱讀 1,465評論 2 1
  • Day1: 在代碼中通過R.string.hello_world可以獲得該字符串的引用显熏; 在XML中通過@stri...
    冰凝雪國閱讀 1,406評論 0 5
  • Android使用底部導航 Android底部導航停留在屏幕底部,提供應用中頂級視圖之間的導航晒屎。這是在具有向后兼容...
    ListenToCode閱讀 2,139評論 1 15