recuperar ocultar notificaciones navegacion iconos estado como cambiar barra activar android material-design bottomnavigationview

android - ocultar - Mostrar insignia en la parte superior del icono de la barra de navegación inferior



ocultar iconos de la barra de estado android (10)

He implementado la vista de navegación inferior en mi aplicación y he buscado en todas partes para mostrar insignias en la parte superior de los iconos como this Me preguntaba si esto es incluso posible de implementar. Cualquier ayuda es apreciada. Gracias.


Agregar distintivos ahora es compatible de forma nativa, utilizando la última dependencia de material agregue esto a su build.gradle

implementation ''com.google.android.material:material:1.1.0-alpha06''

en su diseño agregue esto

<!-- 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" />

entonces puedes simplemente

val navBar = findViewById<BottomNavigationView>(R.id.bottom_navigation) navBar.showBadge(R.id.action_add).number = 2

R.id.action_add para usted sería la identificación del elemento de menú en el que desea colocar una insignia. Verifíquelo desde el archivo de menú que alimenta a BottomNavigationView.

Asegúrese de que el tema de su aplicación esté en Theme.MaterialComponents

puedes verificarlo en estilos o manifiesto. para este ejemplo el mío era este

<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>


BadgeDrawable ahora ha agregado la insignia como parte de AndroidX BottomNavigationView. Ver documentos

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>


Como @zxbin responde. Puede verificar BadgeView e intentar el siguiente código

BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(this); navigation.setSelectedItemId(R.id.navigation_store); BottomNavigationMenuView bottomNavigationMenuView = (BottomNavigationMenuView) navigation.getChildAt(0); View v = bottomNavigationMenuView.getChildAt(4); // number of menu from left new QBadgeView(this).bindTarget(v).setBadgeNumber(5);

fuente de mi esencia


Cuando se utiliza la barra de navegación inferior de la biblioteca de soporte, es bastante complejo mostrar una insignia / notificación en los elementos del menú. Sin embargo, hay soluciones fáciles para hacerlo. Tales como https://github.com/aurelhubert/ahbottomnavigation

Esta biblioteca es la versión más avanzada de la barra de navegación inferior. Y puede configurar una insignia en el elemento del menú simplemente usando este fragmento de código.

bottomNavigation.setNotification(notification, bottomNavigation.getItemsCount() - 1);

Y obtendrás el siguiente resultado


Estaba enfrentando el mismo problema y no quería usar una biblioteca.

Entonces creé un diseño personalizado llamado layout_news_badge :

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/badge_frame_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/badge_text_view" android:layout_width="19dp" android:layout_height="19dp" android:textSize="11sp" android:textColor="@android:color/white" android:background="@drawable/news_bottom_nav_bg" android:layout_gravity="top" android:layout_marginTop="4dp" android:layout_marginStart="16dp" android:gravity="center" android:padding="2dp" tools:text="9+" /> </FrameLayout>

Fondo de TextView ( news_bottom_nav_bg ):

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="?attr/colorPrimary" /> </shape>

Luego creé un BottomMenuHelper con estos 2 métodos:

public static void showBadge(Context context, BottomNavigationView bottomNavigationView, @IdRes int itemId, String value) { removeBadge(bottomNavigationView, itemId); BottomNavigationItemView itemView = bottomNavigationView.findViewById(itemId); View badge = LayoutInflater.from(context).inflate(R.layout.layout_news_badge, bottomNavigationView, false); TextView text = badge.findViewById(R.id.badge_text_view); text.setText(value); itemView.addView(badge); } public static void removeBadge(BottomNavigationView bottomNavigationView, @IdRes int itemId) { BottomNavigationItemView itemView = bottomNavigationView.findViewById(itemId); if (itemView.getChildCount() == 3) { itemView.removeViewAt(2); } }

Luego, cuando lo llamo en mi Actividad:

BottomMenuHelper.showBadge(this, mBottomNavigationView, R.id.action_news, "1");

EDITAR: Mejora agregada por sugerencia jatin rana


Puedes probar de esta manera:

Coloque un TextView dentro de BottomNavigationView para contar ( BottomNavigationView es un FrameLayout ):

<android.support.design.widget.BottomNavigationView android:id="@id/bottomMenu" style="@style/bottomMenu"> <TextView android:id="@id/bottomMenuSelectionsNumber" style="@style/bottomMenuSelectionsNumber"/> </android.support.design.widget.BottomNavigationView>

Y diseñarlos así:

<style name="bottomMenu"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">@dimen/toolbarHeight</item> <item name="android:layout_gravity">center|bottom</item> <item name="android:background">@color/colorThird</item> <item name="itemBackground">@drawable/tabs_ripple</item> <item name="itemIconTint">@drawable/bottom_menu_item_color</item> <item name="itemTextColor">@drawable/bottom_menu_item_color</item> <item name="menu">@menu/bottom_menu</item> </style> <style name="bottomMenuSelectionsNumber"> <item name="android:text">@string/bottomMenuSelectionsNumber</item> <item name="android:textSize">@dimen/appSecondFontSize</item> <item name="android:textColor">@color/white</item> <item name="android:layout_width">@dimen/bottomMenuSelectionsNumberDim</item> <item name="android:layout_height">@dimen/bottomMenuSelectionsNumberDim</item> <item name="android:layout_gravity">right|bottom</item> <item name="android:layout_marginRight">@dimen/bottomMenuSelectionsNumberMarginR</item> <item name="android:layout_marginBottom">@dimen/bottomMenuSelectionsNumberMarginB</item> <item name="android:gravity">center</item> <item name="android:includeFontPadding">false</item> <item name="android:background">@drawable/bottom_menu_selections_number_bg</item> </style>

Y bottom_menu_selections_number_bg :

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="@color/colorAccent"/> <corners android:radius="@dimen/cornerRadius"/> </shape>


Si solo desea usar un BottomNavigationView stock y no una BottomNavigationView terceros, así es como lo hice:

BottomNavigationMenuView bottomNavigationMenuView = (BottomNavigationMenuView) navigationView.getChildAt(0); View v = bottomNavigationMenuView.getChildAt(3); BottomNavigationItemView itemView = (BottomNavigationItemView) v; View badge = LayoutInflater.from(this) .inflate(R.layout.notification_badge, itemView, true);

Entonces aquí está el archivo de diseño:

<merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <TextView android:id="@+id/notifications.badge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top|center_horizontal" android:layout_marginLeft="10dp" android:layout_marginStart="10dp" android:background="@drawable/notification_badge" android:gravity="center" android:padding="3dp" android:text="9+" android:textColor="@color/white" android:textSize="11sp" /> </merge>

Luego, solo busque TextView por id y configure el texto. @drawable/notification_badge es solo una forma circular dibujable


Usar la biblioteca de soporte BottomNavigationView es difícil. Una solución fácil es usar componentes externos. Una fácil de manejar es: https://github.com/roughike/BottomBar Verificar su documentación es tan fácil como:

BottomBarTab nearby = bottomBar.getTabWithId(R.id.tab_nearby); nearby.setBadgeCount(5); // Remove the badge when you''re done with it. nearby.removeBadge/();


basado en la respuesta de @ Tinashe, me gustaría que la insignia se muestre a continuación sin número:

código:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) // position = 2 addBadge(POSITION_HISTORY) } /** * add badge(notification dot) to bottom bar * @param position to get badge container */ @SuppressLint("PrivateResource") private fun addBadge(position: Int) { // get badge container (parent) val bottomMenu = navigation.getChildAt(0) as? BottomNavigationMenuView val v = bottomMenu?.getChildAt(position) as? BottomNavigationItemView // inflate badge from layout badge = LayoutInflater.from(this) .inflate(R.layout.badge_layout, bottomMenu, false) // create badge layout parameter val badgeLayout: FrameLayout.LayoutParams = FrameLayout.LayoutParams(badge?.layoutParams).apply { gravity = Gravity.CENTER_HORIZONTAL topMargin = resources.getDimension(R.dimen.design_bottom_navigation_margin).toInt() // <dimen name="bagde_left_margin">8dp</dimen> leftMargin = resources.getDimension(R.dimen.bagde_left_margin).toInt() } // add view to bottom bar with layout parameter v?.addView(badge, badgeLayout) }

badge_layout.xml (badge_size = 12dp)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="@dimen/badge_size" android:layout_height="@dimen/badge_size" android:background="@drawable/new_notification" />

y fondo dibujable new_notification.xml

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <corners android:radius="100dp"/> <solid android:color="#F44336"/> </shape>


puedes usar esta biblioteca ... para agregar una insignia en la barra de navegación

https://github.com/ahmedewess/Badged-BottomNavigationBar