Android 給BottomNavigationView添加未讀消息紅點(diǎn)提示

開(kāi)篇

??在開(kāi)發(fā)Android應(yīng)用中,為應(yīng)用添加BottomNavigationBar是一件司空見(jiàn)慣的事情卒茬。為此沿癞,google團(tuán)隊(duì)在android.support.design包中就專門提供了快速實(shí)現(xiàn)BottomNavigationBar的控件:BottomNavigationView,而BottomNavigationView并沒(méi)有提供顯示未讀消息紅點(diǎn)提示功能霹抛。本文主要講解如何在BottomNavigationView上實(shí)現(xiàn)顯示未讀消息紅點(diǎn)提示功能谴咸。當(dāng)然轮听,市面上很多大神開(kāi)源了第三方的BottomNavigationBar框架,這里暫不展開(kāi)討論岭佳。不過(guò)這里還是推薦一個(gè)優(yōu)秀的BottomNavigationBar開(kāi)源項(xiàng)目:https://github.com/Ashok-Varma/BottomNavigation血巍!

效果截屏

立即體驗(yàn)

掃描以下二維碼下載體驗(yàn)App(從0.2.3版本開(kāi)始,體驗(yàn)App內(nèi)嵌版本更新檢測(cè)功能):


JSCKit庫(kù)傳送門:https://github.com/JustinRoom/JSCKit

實(shí)施步驟

在添加未讀消息紅點(diǎn)提示之前珊随,分析BottomNavigationView源碼

  • 1述寡、從構(gòu)造函數(shù)著手
public BottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        ...
        mMenuView = new BottomNavigationMenuView(context);
        ...
        mPresenter.setBottomNavigationMenuView(mMenuView);
        ...
        if (a.hasValue(R.styleable.BottomNavigationView_menu)) {
            inflateMenu(a.getResourceId(R.styleable.BottomNavigationView_menu, 0));
        }
        ...
    }

a柿隙、創(chuàng)建BottomNavigationMenuView實(shí)例:mMenuView
b、 BottomNavigationPresenter綁定mMenuView
c鲫凶、 調(diào)用方法inflateMenu(int resId)解析xml菜單文件

  • 2禀崖、inflateMenu(int resId)方法:
    public void inflateMenu(int resId) {
        mPresenter.setUpdateSuspended(true);
        getMenuInflater().inflate(resId, mMenu);
        mPresenter.setUpdateSuspended(false);
        mPresenter.updateMenuView(true);
    }

從方法字面上不難看出updateMenuView就是用來(lái)更新菜單視圖的。

  • 3螟炫、updateMenuView(boolean cleared)方法:
    @Override
    public void updateMenuView(boolean cleared) {
        if (mUpdateSuspended) return;
        if (cleared) {
            mMenuView.buildMenuView();
        } else {
            mMenuView.updateMenuView();
        }
    }

它調(diào)用了mMenuView.buildMenuView()構(gòu)建菜單視圖波附,而mMenuView就是在BottomNavigationView構(gòu)造函數(shù)中BottomNavigationPresenter綁定的BottomNavigationMenuView的實(shí)例。

  • 4昼钻、buildMenuView()方法:
    public void buildMenuView() {
        ...
        for (int i = 0; i < mMenu.size(); i++) {
            mPresenter.setUpdateSuspended(true);
            mMenu.getItem(i).setCheckable(true);
            mPresenter.setUpdateSuspended(false);
            BottomNavigationItemView child = getNewItem();
            mButtons[i] = child;
            child.setIconTintList(mItemIconTint);
            child.setTextColor(mItemTextColor);
            child.setItemBackground(mItemBackgroundRes);
            child.setShiftingMode(mShiftingMode);
            child.initialize((MenuItemImpl) mMenu.getItem(i), 0);
            child.setItemPosition(i);
            child.setOnClickListener(mOnClickListener);
            addView(child);
        }
    }

到這里掸屡,我們不難看出,每一個(gè)menu就是一個(gè)BottomNavigationItemView示例:

public class BottomNavigationItemView extends FrameLayout implements MenuView.ItemView {
}

所以然评,整個(gè)流程看下來(lái)仅财,我們知道:
BottomNavigationView添加了一個(gè)BottomNavigationMenuView實(shí)例,而BottomNavigationMenuView實(shí)例添加了N個(gè)BottomNavigationItemView實(shí)例沾瓦。
很明顯满着,我們要給每個(gè)menu添加未讀消息紅點(diǎn)提示其實(shí)就是在BottomNavigationItemView實(shí)例上添加一個(gè)顯示未讀消息的view。

在BottomNavigationItemView上添加未讀消息紅點(diǎn)提示view

  • 1贯莺、找到BottomNavigationMenuView
        private BottomNavigationView navigation;
        BottomNavigationMenuView menuView = null;
        for (int i = 0; i < navigation.getChildCount(); i++) {
            View child = navigation.getChildAt(i);
            if (child instanceof BottomNavigationMenuView) {
                menuView = (BottomNavigationMenuView) child;
                break;
            }
        }
  • 2风喇、找到BottomNavigationItemView并添加未讀消息紅點(diǎn)view
      if (menuView != null) {
            int dp8 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
            dotViews = new DotView[menuView.getChildCount()];
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView.LayoutParams params = new BottomNavigationItemView.LayoutParams(i == menuView.getChildCount() - 1 ? dp8 : dp8 * 2, 0);
                params.gravity = Gravity.CENTER_HORIZONTAL;
                params.leftMargin = dp8 * 3;
                params.topMargin = dp8 / 2;
                BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
                DotView dotView = new DotView(this);
                itemView.addView(dotView, params);
                if (i < menuView.getChildCount() - 1) {
                    dotView.setUnReadCount(new Random().nextInt(20));
                }
                dotViews[i] = dotView;
            }
        }

運(yùn)行后看效果。

這里是詳細(xì)實(shí)現(xiàn)實(shí)例:
https://github.com/JustinRoom/JSCKit/blob/master/app/src/main/java/jsc/exam/jsckit/ui/BottomNavigationViewActivity.java

篇尾

??原創(chuàng)不易缕探,給個(gè)愛(ài)心魂莫,謝謝!QQ:1006368252爹耗。

勿問(wèn)成功的秘訣為何耙考,且盡全力做你應(yīng)該做的事吧√妒蓿——美華納

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倦始,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子山卦,更是在濱河造成了極大的恐慌鞋邑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件账蓉,死亡現(xiàn)場(chǎng)離奇詭異枚碗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)铸本,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門肮雨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人箱玷,你說(shuō)我怎么就攤上這事怨规∧八蓿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵椅亚,是天一觀的道長(zhǎng)限番。 經(jīng)常有香客問(wèn)我,道長(zhǎng)呀舔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任扩灯,我火速辦了婚禮媚赖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘珠插。我一直安慰自己惧磺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布捻撑。 她就那樣靜靜地躺著磨隘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾患。 梳的紋絲不亂的頭發(fā)上番捂,一...
    開(kāi)封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音江解,去河邊找鬼设预。 笑死,一個(gè)胖子當(dāng)著我的面吹牛犁河,可吹牛的內(nèi)容都是我干的鳖枕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼桨螺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宾符!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起灭翔,我...
    開(kāi)封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤魏烫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缠局,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體则奥,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年狭园,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了读处。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唱矛,死狀恐怖罚舱,靈堂內(nèi)的尸體忽然破棺而出井辜,到底是詐尸還是另有隱情,我是刑警寧澤管闷,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布粥脚,位于F島的核電站,受9級(jí)特大地震影響包个,放射性物質(zhì)發(fā)生泄漏刷允。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一碧囊、第九天 我趴在偏房一處隱蔽的房頂上張望树灶。 院中可真熱鬧,春花似錦糯而、人聲如沸天通。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)像寒。三九已至,卻和暖如春瓜贾,著一層夾襖步出監(jiān)牢的瞬間诺祸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工阐虚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留序臂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓实束,卻偏偏與公主長(zhǎng)得像奥秆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咸灿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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