Элементы меню NavigationView со счетчиком справа

Новый NavigationView в новой библиотеке поддержки дизайна работает очень здорово.

Они используют « пункты меню » для отображения параметров.

Но как я могу отобразить счетчик справа от пункта меню?

Как на картинке:

Введите описание изображения здесь

Или как в приложении GMail .

Solutions Collecting From Web of "Элементы меню NavigationView со счетчиком справа"

Начиная с версии 23 appcompat-v7 NavigationView поддерживает представления действий, поэтому очень легко реализовать счетчик самостоятельно.

  1. Создайте раскладку счетчика, то есть 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); } 

Обратите внимание, что вам нужно будет использовать MenuItemCompat, если вам нужно поддерживать версии Android 2.x.

Моим обходным путем был переход 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()-(counter.length()+2), s.length(), 0); sColored.setSpan(new ForegroundColorSpan( Color.WHITE ), s.length()-(counter.length()+2), s.length(), 0); element.setTitle(sColored); 

Чтобы улучшить счетчик, здесь вы можете найти хороший ответ, чтобы установить углы округленными

Пример:

Введите описание изображения здесь

Рассматривая источник для NavigationView , они в настоящее время не поддерживают какой-либо пользовательский рендеринг элементов меню (см. NavigationMenuPresenter и NavigationMenuAdapter ). Надеюсь, они скоро откроют больше функций, поскольку я хочу установить пользовательский шрифт в элементах меню, но я не могу без отражения.

Существует большая библиотека, которая может это сделать – 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"); }