Intereting Posts
Android: Как установить абсолютный размер окна Activity? Как закрыть AlertDialog.Builder без нажатия любой кнопки Установка увеличения / уменьшения интервала NumberPicker Как включить эмулятор Genymotion для использования Интернета WIFI, который использует хост Как определить, какие собственные общие библиотеки загружаются приложением Android Значок элемента ящика навигации, не отображающий исходный цвет Настройка максимального уровня масштабирования в google maps android api v2 Как преобразовать координаты изображения в координаты растрового изображения? Является ли FLAG_ONLY_ALERT_ONCE сломанным или неправильным, или и то, и другое? TextView добавление градиента AND shadow Фотосъемка с камеры в фрагменте Использование Guice для встраивания зависимостей в конструктор активности Android E / ActivityThread: не удалось найти информацию о поставщике для com.example.YPLContentProvider Cordova 3.4.0 navigator.camera.getPicture не вызывает обратный вызов onSuccess или onFail для Android 4.3 Android Stop Emulator из командной строки

Элементы меню 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"); }