Android 如何在NavigationView中的项目上添加徽章

Android 如何在NavigationView中的项目上添加徽章,android,navigation-drawer,Android,Navigation Drawer,我刚开始使用新的组件android.support.design.widget.NavigationView,在此之前,我使用标准的listview,但现在我开始使用新的组件导航视图,在项目上实现badge时遇到问题。 现在有人知道如何解决这个问题了吗?您仍然需要使用ListView来设置布局 对于使用NavigationView属性,我的解决方法是将具有不同背景的SpannableString作为MenuItem的新标题传递 我知道这不是最好的解决方案,但它作为计数器非常有效。大概是这样的:

我刚开始使用新的组件android.support.design.widget.NavigationView,在此之前,我使用标准的listview,但现在我开始使用新的组件导航视图,在项目上实现badge时遇到问题。
现在有人知道如何解决这个问题了吗?

您仍然需要使用ListView来设置布局

对于使用NavigationView属性,我的解决方法是将具有不同背景的SpannableString作为MenuItem的新标题传递

我知道这不是最好的解决方案,但它作为计数器非常有效。大概是这样的:

NavigationView navigation = (NavigationView)findViewById(R.id.navigation);
Menu menuNav = navigation.getMenu();
MenuItem element = menuNav.findItem(R.id.item5);
String before = element.getTitle().toString();

String counter = Integer.toString(5);
String s = before + "   "+counter+" ";
SpannableString sColored = new SpannableString( s );

sColored.setSpan(new BackgroundColorSpan( Color.GRAY ), s.length()-3, s.length(), 0);
sColored.setSpan(new ForegroundColorSpan( Color.WHITE ), s.length()-3, s.length(), 0);


element.setTitle(sColored);

这可以通过以下步骤完成

1。将“actionViewClass”属性添加到导航抽屉菜单中

创建带有导航抽屉的“Helloworld”应用程序后,在项目层次结构视图的文件夹“菜单”下查找文件“activity\u main\u Drawer.xml”(即youractivityname\u Drawer.xml)。 识别组项目并添加“app:actionViewClass=android.widget.TextView”,如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">

<group android:checkableBehavior="single">
    <item
        android:id="@+id/nav_camera"
        android:icon="@drawable/ic_menu_camera"
        android:title="Import" />
    <item
        android:id="@+id/nav_gallery"
        app:actionViewClass="android.widget.TextView"
        android:icon="@drawable/ic_menu_gallery"
        android:title="Gallery" />
    <item
        android:id="@+id/nav_slideshow"
        app:actionViewClass="android.widget.TextView"
        android:icon="@drawable/ic_menu_slideshow"
        android:title="Slideshow" />
    <item
        android:id="@+id/nav_manage"
        android:icon="@drawable/ic_menu_manage"
        android:title="Tools" />
</group>
可以在任何需要的地方调用initializeCountDrawer()。它还可用于更新导航抽屉菜单项中的计数或徽章值

private void initializeCountDrawer() {
    //Gravity property aligns the text
    gallery.setGravity(Gravity.CENTER_VERTICAL);
    gallery.setTypeface(null, Typeface.BOLD);
    gallery.setTextColor(getResources().getColor(R.color.colorAccent));
    gallery.setText("99+");
    slideshow.setGravity(Gravity.CENTER_VERTICAL);
    slideshow.setTypeface(null,Typeface.BOLD);                
    slideshow.setTextColor(getResources().getColor(R.color.colorAccent));

    //count is added     
    slideshow.setText("7");
}
添加上述方法后,运行应用程序。瞧!! 导航抽屉的“gallery”(多媒体资料)和“slideshow”(幻灯片放映)菜单项上将显示简单的徽章计数

动态徽章值

如果需要动态标记值,如从API调用或SQLite数据库更新值,请创建一个可重用的方法,并在活动的OnStart()或OnResume()方法上进行更新


可以找到完整的源代码

Hi,请更具体一些。您是否有任何代码显示您遇到的问题?我需要在菜单项右侧显示计数?谢谢,但我已经知道此解决方案,但是如果使用listview,我会丢失一些很棒的NavigationView功能。此解决方案不使用listview:)@Marco如何将其更改为使用圆形作为背景?我试图将BackgroundColorSpan替换为RoundedBackgroundSpan,但它不在中心请看一看公认的答案,它非常有效:)无需担心。我在做navigationView.getMenu().clear();重置菜单。每次这样做时,我都必须调用messagesTextView=(TextView)MenuItemCompat.getActionView(navigationView.getMenu().findItem(R.id.nav_messages));把一切都重新设置好,这样就行了。只是从他没有信用卡的地方抄袭?
private void initializeCountDrawer() {
    //Gravity property aligns the text
    gallery.setGravity(Gravity.CENTER_VERTICAL);
    gallery.setTypeface(null, Typeface.BOLD);
    gallery.setTextColor(getResources().getColor(R.color.colorAccent));
    gallery.setText("99+");
    slideshow.setGravity(Gravity.CENTER_VERTICAL);
    slideshow.setTypeface(null,Typeface.BOLD);                
    slideshow.setTextColor(getResources().getColor(R.color.colorAccent));

    //count is added     
    slideshow.setText("7");
}