【问题标题】:How to add badge on item in NavigationView如何在 NavigationView 中的项目上添加徽章
【发布时间】:2015-11-01 15:52:22
【问题描述】:

我刚刚开始使用新组件 android.support.design.widget.NavigationView ,在此之前我使用标准列表视图作为导航抽屉,但现在我开始使用新组件导航视图并且在项目上实现徽章时遇到问题。 有人现在如何解决这个问题?

【问题讨论】:

  • 您好,请说的更具体些。您是否有任何代码可以显示您遇到的问题?
  • 我需要在菜单项的右侧显示一个计数吗?

标签: android navigation-drawer


【解决方案1】:

这可以通过以下步骤完成

1.在导航抽屉菜单中添加“actionViewClass”属性

使用 Navigation Drawer 创建“Helloworld”应用程序后,在项目层次结构视图的“Menu”文件夹下查找文件“activity_main_drawer.xml”(即 youractivityname_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>

2。声明 Navigation Drawer 菜单项并使用标​​记值初始化该项。

在您的主 Activity 中,声明 Navigation Drawer 的菜单项,如下所示

//Create these objects above OnCreate()of your main activity
TextView slideshow,gallery;

//These lines should be added in the OnCreate() of your main activity
gallery=(TextView) MenuItemCompat.getActionView(navigationView.getMenu().findItem(R.id.nav_gallery));
slideshow=(TextView) MenuItemCompat.getActionView(navigationView.getMenu().findItem(R.id.nav_slideshow));

//This method will initialize the count value
initializeCountDrawer();

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");
}

添加上述方法后,运行应用程序。瞧! 导航抽屉的“画廊”和“幻灯片”菜单项上将显示一个简单的徽章计数。

动态徽章值

如果您需要动态徽章值,例如从 API 调用或 SQLite 数据库更新值,请创建可重用方法并在 Activity 的 OnStart() 或 OnResume() 方法上更新它。

完整的源代码可以找到here

【讨论】:

  • 没关系。我在做 navigationView.getMenu().clear();重置菜单。每次我这样做时,我都必须调用 messagesTextView = (TextView) MenuItemCompat.getActionView(navigationView.getMenu().findItem(R.id.nav_messages));重置一切,然后它就可以工作了。
  • 只是从android.jlelse.eu/…复制而来的,他没有信用?
【解决方案2】:

你仍然必须使用 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);

【讨论】:

  • 谢谢,但我已经知道这个解决方案,但如果我使用 listview,我会失去一些很棒的 NavigationView 功能。
  • 此解决方案不使用 Listview :)
  • @Marco 如何更改它以使用圆圈作为背景?我正在尝试将 BackgroundColorSpan 替换为 RoundedBackgroundSpan,但它不在中心
  • 看看这个question接受的答案,它工作得很好:)
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多