Подтвердить что ты не робот

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

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

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

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

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

enter image description here

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

4b9b3361

Ответ 1

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

  • Создать макет счетчика, т.е. 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().

  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.

Ответ 2

Моим обходным путем передавался 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);

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

Пример:

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

Ответ 3

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

Ответ 5

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