BottomNavigationView 添加 badge(气泡
一:选取badge库
这里选用BadgeView作为示例,链接地址https://github.com/qstumn/BadgeView
二:android.support.design.widget.BottomNavigationView 代码简要分析
1:基本上使用任何badgeview 库都需要一个目标view。而大部分人认为BottomNavigationView中没有暴露相应方法拿到item,所以觉得直接放弃了。
2:其实通过查看源码发现,BottomNavigationView最终是通过BottomNavigationMenuView显示的,而BottomNavigationMenuView内部含有一个R.menu.xxx 的解析器BottomNavigationPresenter,以及一个BottomNavigationItemView数组(可以把BottomNavigationItemView简要理解为BottomNavigationView的每个按键),而且最关键的代码在于BottomNavigationItemView实例化:
@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());这就意味着,我们从屏幕上看到的每个按钮的id,其实和R.menu.xxx 里设置的按钮id是一致的,那接下来就很明朗了,通过findviewbyid,我们就可以拿到这个按钮,接着我们就能添加badgele
三:最终效果及代码
最终效果暂时没有找到上传文件的地方,把这个类粘贴出来了,重点部分已经加粗,非常的简单。
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);
}
}