Я реализовал нижнее представление навигации в своем приложении, и я посмотрел каждый, где отобразить значки сверху значков как это, я задавался вопросом, возможно ли это даже реализовать. Любая справка ценится.Спасибо.
Добавление значков исходно поддерживается теперь, использование последней существенной зависимости добавляет, что это к Вашему build.gradle
implementation 'com.google.android.material:material:1.1.0-alpha09'
в Вашем расположении добавляет это
<!-- The rest of your layout here ....-->
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:menu="@menu/bottom_nav_menu"
/>
затем, Вы можете всего
val navBar = findViewById<BottomNavigationView>(R.id.bottom_navigation)
navBar.getOrCreateBadge(R.id.action_add).number = 2
, R.id.action_add для Вас был бы идентификатором пункта меню, Вы хотите поставить значок. Проверьте его от файла меню, который Вы подаете к BottomNavigationView.
Удостоверяются, что Ваша тема приложения находится в Теме. MaterialComponents
можно проверить его в стили или декларацию. для этого примера шахта была этим
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@color/colorPrimary</item>
</style>
Значок был теперь добавлен как часть AndroidX BottomNavigationView BadgeDrawable. См. документы
fun setBadge(count: Int) {
if (count == 0) {
bottomNavigationView.removeBadge(R.id.ticketsNavigation)
} else {
val badge = bottomNavigationView.showBadge(R.id.ticketsNavigation)
badge.number = count
badge.backgroundColor = getColor(R.color.badge)
badge.badgeTextColor = getColor(R.color.blackTextColor)
}
}
// Menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/ticketsNavigation"
android:icon="@drawable/vector_drawable_navbar_tickets"
android:title="@string/tickets_title"/>
...
</menu>
Попробуйте это однажды.
1) Создают XML-файл для значка (напр. notification_badge_view.xml)
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/badge"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="top|center_horizontal"
android:layout_marginStart="10dp"
android:gravity="center"
android:padding="3dp"
app:srcCompat="@drawable/notification_badge" />
</FrameLayout>
2) Создают drawable файл для формы точки уведомления (напр. badge_circle.xml)
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/colorAccent" />
<stroke
android:width="2dp"
android:color="@android:color/white" />
</shape>
3) В Вашем действии onCreate метод добавляют представление значка к [1 114] BottomNavigationView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing);
addBadgeView();
}
4), И addBadgeView метод ниже
private void addBadgeView() {
try {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationBar.getChildAt(0);
BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(0); //set this to 0, 1, 2, or 3.. accordingly which menu item of the bottom bar you want to show badge
notificationBadge = LayoutInflater.from(LandingActivity.this).inflate(R.layout.view_notification_badge, menuView, false);
itemView.addView(notificationBadge);
notificationBadge.setVisibility(GONE);// initially badge will be invisible
} catch (Exception e) {
e.printStackTrace();
}
}
Примечание: bottomNavigationBar является Вашим нижним представлением панели.
5) значок Обновления, чтобы показать и скрыться следующим методом
private void refreshBadgeView() {
try {
boolean badgeIsVisible = notificationBadge.getVisibility() != GONE;
notificationBadge.setVisibility(badgeIsVisible ? GONE : VISIBLE);//makes badge visible and invisible
} catch (Exception e) {
e.printStackTrace();
}
}
6) И точно сделать скрываются когда мы нажимающий на конкретную нижнюю страницу панели следующей строкой.
bottomNavigationBar.setOnNavigationItemSelectedListener(new
BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem)
{
switch (menuItem.getItemId()) {
case R.id.bottom_bar_one:
//while moving to first fragment
notificationBadge.setVisibility(GONE);
break;
case R.id.bottom_bar_two:
//moving to second fragment
break;
case R.id.bottom_bar_three:
//moving to third fragment
break;
}
return true;
}
});
ответ @Abel является лучшим, если Вы уже не имеете сложный набор тем и не имеете времени для изменения их всех.
Однако, если a) Вы торопитесь и если Вы используете библиотеку Google Material BottomNavigationView Панель или b) Вы захотите добавить свой собственный значок представления - затем, то принятый ответ не будет работать с com.google.android.material:material:1.1.0
, необходимо будет кодировать для иерархии другого представления, чем принятый ответ
BottomNavigationItemView itemView = (BottomNavigationItemView) ((BottomNavigationMenuView) mBottomNavigation.getChildAt(0)).getChildAt(2);
View badge = LayoutInflater.from(this).inflate(R.layout.navigation_dot, itemView, false);
itemView.addView(badge);
, если Вы действительно захотите обновить свою тему и обновление
com.google.android.material:material:1.1.0-alpha09
затем все, что необходимо сделать вместо этого,
mBottomNavigation.getOrCreateBadge(R.id.navigation_menu_item_one).setNumber(YOUR_NUMBER);
, удаление и функции числа только присутствуют в 1.1.0-alpha09 версии (и выше)
можно пользоваться этой библиотекой.. добавить значок на панели навигации
https://github.com/ahmedewess/Badged-BottomNavigationBar