NavigationView菜单项与右侧的计数器

新的devise支持库中的新的NavigationView的工作真的很棒。

他们使用“ 菜单项 ”来显示选项。

但是怎样才能在菜单项右边显示一个计数器呢?

就像这张照片一样:

在这里输入图像描述

或者像在GMail应用程序。

从appcompat-v7的版本23开始, NavigationView支持动作视图,所以很容易实现。

  1. 创build计数器布局,即menu_counter.xml

     <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> 
  2. 在抽屉菜单xml中引用它,即menu/drawer.xml

     <item ... app:actionLayout="@layout/menu_counter" /> 

请注意,您应该使用app命名空间,不要尝试使用android

或者,您可以使用MenuItem.setActionView()方法手动设置操作视图。

  1. 查找菜单项并设置计数器:

     private void setMenuCounter(@IdRes int itemId, int count) { TextView view = (TextView) navigationView.getMenu().findItem(itemId).getActionView(); view.setText(count > 0 ? String.valueOf(count) : null); } 

请注意,如果您必须支持Android 2.x版本,则需要使用MenuItemCompat 。

我的解决方法是传递一个SpannableString与不同的背景作为MenuItem的新标题。

我所知道的不是最好的解决scheme,它不是正确的,但它作为一个柜台相当好。 像这样的东西:

 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()-(counter.length()+2), s.length(), 0); sColored.setSpan(new ForegroundColorSpan( Color.WHITE ), s.length()-(counter.length()+2), s.length(), 0); element.setTitle(sColored); 

为了改善计数器, 在这里你可以find一个很好的答案来设置圆angular

例:

在这里输入图像描述

查看NavigationView的源代码,它们当前不支持任何自定义的菜单项呈现(请参阅NavigationMenuPresenterNavigationMenuAdapter )。 希望他们尽快公开更多的function,因为我想在菜单项上设置自定义字体,但是无法使用reflection。

有伟大的图书馆,可以做到这一点 – https://github.com/mikepenz/MaterialDrawer

第1步 :确定组项目,并添加“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_recorder" app:actionViewClass="android.widget.TextView" android:icon="@drawable/ic_menu_gallery" android:title="Gallery" /> <item android:id="@+id/nav_night_section" app:actionViewClass="android.widget.TextView" android:icon="@drawable/ic_menu_slideshow" android:title="Slideshow" /> </group> 

步骤2:声明“导航抽屉”菜单项并使用徽章值初始化该项目

 //Create these objects above OnCreate()of your main activity TextView recorder,nightSection; //These lines should be added in the OnCreate() of your main activity recorder =(TextView) MenuItemCompat.getActionView(navigationView.getMenu(). findItem(R.id.nav_recorder)); recordSection=(TextView) MenuItemCompat.getActionView(navigationView.getMenu(). findItem(R.id.nav_night_section)); //This method will initialize the count value initializeCountDrawer(); 

第3步:initializeCountDrawer()可以在需要时调用。 它也可用于更新导航抽屉菜单项中的计数或标记值。

 private void initializeCountDrawer(){ //Gravity property aligns the text recorder.setGravity(Gravity.CENTER_VERTICAL); recorder.setTypeface(null, Typeface.BOLD); recorder.setTextColor(getResources().getColor(R.color.colorAccent)); recorder.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"); }