一:選取badge庫
這里選用BadgeView作為示例,鏈接地址https://github.com/qstumn/BadgeView
二:android.support.design.widget.BottomNavigationView 代碼簡要分析
1:基本上使用任何badgeview 庫都需要一個(gè)目標(biāo)view。而大部分人認(rèn)為BottomNavigationView中沒有暴露相應(yīng)方法拿到item,所以覺得直接放棄了。
2:其實(shí)通過查看源碼發(fā)現(xiàn),BottomNavigationView最終是通過BottomNavigationMenuView顯示的,而BottomNavigationMenuView內(nèi)部含有一個(gè)R.menu.xxx 的解析器BottomNavigationPresenter,以及一個(gè)BottomNavigationItemView數(shù)組(可以把BottomNavigationItemView簡要理解為BottomNavigationView的每個(gè)按鍵),而且最關(guān)鍵的代碼在于BottomNavigationItemView實(shí)例化:
@Override
public voidinitialize(MenuItemImpl itemData,intmenuType) {
mItemData= itemData;
setCheckable(itemData.isCheckable());
setChecked(itemData.isChecked());
setEnabled(itemData.isEnabled());
setIcon(itemData.getIcon());
setTitle(itemData.getTitle());
setId(itemData.getItemId());
setContentDescription(itemData.getContentDescription());
TooltipCompat.setTooltipText(this, itemData.getTooltipText());
}
其中有一句為?setId(itemData.getItemId());這就意味著,我們從屏幕上看到的每個(gè)按鈕的id,其實(shí)和R.menu.xxx 里設(shè)置的按鈕id是一致的,那接下來就很明朗了,通過findviewbyid,我們就可以拿到這個(gè)按鈕,接著我們就能添加badgele
三:最終效果及代碼

暫時(shí)沒有找到上傳文件的地方,把這個(gè)類粘貼出來了,重點(diǎn)部分已經(jīng)加粗,非常的簡單。
public classMainActivityextendsAppCompatActivity {
privateTextViewmTextMessage;
BottomNavigationItemViewitemhome;
BottomNavigationItemViewdashboard;
BottomNavigationItemViewnotifications;
Badgebadge1;
Badgebadge2;
Badgebadge3;
privateBottomNavigationView.OnNavigationItemSelectedListenermOnNavigationItemSelectedListener
=newBottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public booleanonNavigationItemSelected(@NonNullMenuItem item) {
switch(item.getItemId()) {
caseR.id.navigation_home:
mTextMessage.setText(R.string.title_home);
return true;
caseR.id.navigation_dashboard:
mTextMessage.setText(R.string.title_dashboard);
return true;
caseR.id.navigation_notifications:
mTextMessage.setText(R.string.title_notifications);
return true;
}
return false;
}
};
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextMessage= (TextView) findViewById(R.id.message);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
itemhome= navigation.findViewById(R.id.navigation_home);
dashboard= navigation.findViewById(R.id.navigation_dashboard);
notifications= navigation.findViewById(R.id.navigation_notifications);
badge1=newQBadgeView(this).bindTarget(itemhome)
.setShowShadow(true)
.setBadgeGravity(Gravity.END|Gravity.TOP)
.setOnDragStateChangedListener(newBadge.OnDragStateChangedListener() {
@Override
public voidonDragStateChanged(intdragState, Badge badge, View targetView) {
}
})
.setBadgeNumber(1);
badge2=newQBadgeView(this).bindTarget(dashboard)
.setShowShadow(true)
.setBadgeGravity(Gravity.END|Gravity.TOP)
.setOnDragStateChangedListener(newBadge.OnDragStateChangedListener() {
@Override
public voidonDragStateChanged(intdragState, Badge badge, View targetView) {
}
})
.setBadgeNumber(2);
badge3=newQBadgeView(this).bindTarget(notifications)
.setShowShadow(true)
.setBadgeGravity(Gravity.END|Gravity.TOP)
.setOnDragStateChangedListener(newBadge.OnDragStateChangedListener() {
@Override
public voidonDragStateChanged(intdragState, Badge badge, View targetView) {
}
})
.setBadgeNumber(3);
}
@Override
public voidonWindowFocusChanged(booleanhasFocus) {
super.onWindowFocusChanged(hasFocus);
intw =itemhome.getMeasuredWidth();
badge1.setGravityOffset((int)(w*0.3),0,false);
badge2.setGravityOffset((int)(w*0.3),0,false);
badge3.setGravityOffset((int)(w*0.3),0,false);
}
}