NavigationView菜单项与右侧的计数器
新的devise支持库中的新的NavigationView的工作真的很棒。
他们使用“ 菜单项 ”来显示选项。
但是怎样才能在菜单项右边显示一个计数器呢?
就像这张照片一样:
或者像在GMail应用程序。
从appcompat-v7的版本23开始, NavigationView
支持动作视图,所以很容易实现。
-
创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" />
-
在抽屉菜单xml中引用它,即
menu/drawer.xml
:<item ... app:actionLayout="@layout/menu_counter" />
请注意,您应该使用app
命名空间,不要尝试使用android
。
或者,您可以使用MenuItem.setActionView()
方法手动设置操作视图。
-
查找菜单项并设置计数器:
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
的源代码,它们当前不支持任何自定义的菜单项呈现(请参阅NavigationMenuPresenter
和NavigationMenuAdapter
)。 希望他们尽快公开更多的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"); }