在更新到最新的androidx包下使用的使用时需要注意一下地方:
1.导入的包名不一样
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bnv"
android:layout_width="0dp"
android:layout_height="50dp"
android:paddingTop="0dp"
android:background="#ffffff"
app:itemIconSize="33dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu"
app:labelVisibilityMode="labeled" />
2.添加角标的方法
a.添加直接的布局
//获取整个的NavigationView
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigation.getChildAt(0);
//这里就是获取所添加的每一个Tab(或者叫menu),
View tab = menuView.getChildAt(3);
BottomNavigationItemView itemView = (BottomNavigationItemView) tab;
//加载我们的角标View,新创建的一个布局
View badge = LayoutInflater.from(this).inflate(R.layout.menu_badge, menuView, false);
//添加到Tab上
itemView.addView(badge);
TextView count = (TextView) badge.findViewById(R.id.tv_msg_count);
count.setText(String.valueOf(1));
count.setVisibility(View.VISIBLE);
//如果没有消息,不需要显示的时候那只需要将它隐藏即可
// count.setVisibility(View.GONE);
b.通过获取BottomNavigationView的控件布局来直接添加
/**
* BottomNavigationView显示角标
*
* @param viewIndex tab索引
* @param showNumber 显示的数字,小于等于0是将不显示
*/
private void showBadgeView(BottomNavigationView bottomNavigationView,int viewIndex, int showNumber) {
// 具体child的查找和view的嵌套结构请在源码中查看
// 从bottomNavigationView中获得BottomNavigationMenuView
BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationView.getChildAt(0);
// 从BottomNavigationMenuView中获得childview, BottomNavigationItemView
if (viewIndex < menuView.getChildCount()) {
// 获得viewIndex对应子tab
View view = menuView.getChildAt(viewIndex);
// 从子tab中获得其中显示图片的ImageView
View icon = view.findViewById(com.google.android.material.R.id.icon);
// 获得图标的宽度
int iconWidth = icon.getWidth();//注意:当直接在oncreate方法中使用值为0,因为整个界面没有创建完成,无法获取这个imageview宽
// int iconWidth = icon.getLayoutParams().width;
// 获得tab的宽度/2
int tabWidth = view.getWidth() / 2;//注意:当直接在oncreate方法中使用值为0,因为整个界面没有创建完成,无法获取这个BottomNavigationItemView宽
// 计算badge要距离右边的距离
int spaceWidth = tabWidth - iconWidth;
// 显示badegeview
new QBadgeView(this).bindTarget(view).setGravityOffset(spaceWidth, 3, false).setBadgeNumber(showNumber);
}
}
这个需要注意的是icon的id,因为在Androidx包下,不是在support包下,所以跟网上大多数说的不一样
![](https://img.haomeiwen.com/i2754914/e8e5d19294aa681a.png)
这个可以从源码里BottomNavigationItemView类中找的到
![](https://img.haomeiwen.com/i2754914/f9c9c30dfdba94bf.png)
网友评论