Ich habe die untere Navigationsansicht in meiner App implementiert und habe nach allen Stellen gesucht, an denen Abzeichen über den Symbolen angezeigt werden sollen, z. B. this . Ich habe mich gefragt, ob dies überhaupt möglich ist. Jede Hilfe wird geschätzt. Danke.
Bei Verwendung der unteren Navigationsleiste der Unterstützungsbibliothek ist es recht komplex, ein Abzeichen/eine Benachrichtigung für Menüelemente anzuzeigen. Es gibt jedoch einfache Lösungen, um dies zu erreichen. Wie https://github.com/aurelhubert/ahbottomnavigation
Diese Bibliothek ist eine erweiterte Version der unteren Navigationsleiste. Mit diesem Code-Snippet können Sie einfach ein Abzeichen für einen Menüpunkt festlegen.
bottomNavigation.setNotification(notification, bottomNavigation.getItemsCount() - 1);
Und Sie werden folgendes Ergebnis erhalten
Wenn Sie nur eine Aktie BottomNavigationView
und keine Drittanbieter-Bibliothek verwenden möchten, gehen Sie wie folgt vor:
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);
Dann ist hier die Layoutdatei:
<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>
Dann suchen Sie einfach TextView
nach id und geben Sie Text ein. @drawable/notification_badge
ist nur eine Kreisform, die gezeichnet werden kann
Das Hinzufügen von Ausweisen wird jetzt von Haus aus unterstützt. Verwenden Sie dazu die neueste Materialabhängigkeit und fügen Sie diese zu Ihrem build.gradle hinzu
implementation 'com.google.Android.material:material:1.1.0-alpha09'
fügen Sie dies in Ihr Layout ein
<!-- 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"
/>
dann kannst du einfach
val navBar = findViewById<BottomNavigationView>(R.id.bottom_navigation)
navBar.getOrCreateBadge(R.id.action_add).number = 2
R.id.action_add für Sie wäre die ID des Menüpunkts, auf den Sie ein Abzeichen setzen möchten. Überprüfen Sie es in der Menüdatei, die Sie an BottomNavigationView senden.
Stellen Sie sicher, dass sich Ihr App-Thema in Theme.MaterialComponents befindet
sie können es in Stilen oder Manifest überprüfen. für dieses Beispiel war meins das
<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>
Ich hatte das gleiche Problem und wollte keine Bibliothek benutzen.
Also habe ich ein benutzerdefiniertes Layout mit dem Namen layout_news_badge
Erstellt:
<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>
TextView Hintergrund (news_bottom_nav_bg
):
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="oval">
<solid Android:color="?attr/colorPrimary" />
</shape>
Dann habe ich mit diesen 2 Methoden ein BottomMenuHelper
erstellt:
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);
}
}
Wenn ich es dann in meiner Aktivität aufrufe:
BottomMenuHelper.showBadge(this, mBottomNavigationView, R.id.action_news, "1");
BEARBEITEN: Zusätzliche Verbesserung durch Vorschlag jatin rana
basierend auf der Antwort von @ Tinashe möchte ich ein Abzeichen ohne Nummer zeigen:
code:
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" />
und zeichnbarer Hintergrund 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>
Als @zxbin Antwort. Sie können BadgeView überprüfen und den folgenden Code versuchen
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);
quelle von mein Kern
Das Abzeichen wurde jetzt als Teil von AndroidX BottomNavigationView von BadgeDrawable hinzugefügt. Siehe Dokumentation
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>
Sie können es folgendermaßen versuchen:
Fügen Sie ein TextView in das BottomNavigationView ein, um ( BottomNavigationView) zu zählen ist ein 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>
Und gestalte sie so:
<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>
Und 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>
Bitte versuchen Sie es einmal.
1) XML-Datei für Badge erstellen (z. B. 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) Zeichnungsdatei für Benachrichtigungspunktform erstellen (z. B. 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) Fügen Sie in Ihrer Aktivität onCreate-Methode die Badge-Ansicht zu BottomNavigationView hinzu
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing);
addBadgeView();
}
4) Und die addBadgeView-Methode ist unten
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();
}
}
Hinweis: bottomNavigationBar ist Ihre Ansicht der unteren Leiste.
5) Aktualisieren Sie das Abzeichen, um es wie folgt anzuzeigen und auszublenden
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) Und machen Sie es fein versteckt, wenn wir auf eine bestimmte Leistenunterseite klicken, indem wir der Zeile folgen.
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;
}
});
@Abels Antwort ist die beste, es sei denn, Sie haben bereits komplexe Themen und haben nicht die Zeit, alle zu ändern.
Wenn Sie jedoch a) unter Zeitdruck stehen und die BottomNavigationView-Leiste der Google-Materialbibliothek verwenden oder b) Ihr eigenes benutzerdefiniertes Ansichtsabzeichen hinzufügen möchten, funktioniert die akzeptierte Antwort mit com.google.Android.material:material:1.1.0
Nicht.
Sie müssen für eine andere Ansichtshierarchie als die akzeptierte Antwort codieren
BottomNavigationItemView itemView = (BottomNavigationItemView) ((BottomNavigationMenuView) mBottomNavigation.getChildAt(0)).getChildAt(2);
View badge = LayoutInflater.from(this).inflate(R.layout.navigation_dot, itemView, false);
itemView.addView(badge);
wenn Sie Ihr Thema aktualisieren und auf aktualisieren möchten
com.google.Android.material:material:1.1.0-alpha09
dann brauchen Sie nur noch zu tun
mBottomNavigation.getOrCreateBadge(R.id.navigation_menu_item_one).setNumber(YOUR_NUMBER);
Die Funktionen remove und number sind nur in der Version 1.1.0-alpha09 (und höher) verfügbar.
Die Verwendung der Unterstützungsbibliothek BottomNavigationView ist schwierig. Eine einfache Lösung ist die Verwendung externer Komponenten. Eine einfach zu handhabende ist: https://github.com/roughike/BottomBar Überprüfen der Dokumentation ist so einfach wie:
BottomBarTab nearby = bottomBar.getTabWithId(R.id.tab_nearby);
nearby.setBadgeCount(5);
// Remove the badge when you're done with it.
nearby.removeBadge/();