Новый NavigationView в новой Библиотеке поддержки дизайна отлично работает.
Они используют " пункты меню" для отображения параметров.
Но как я могу отобразить счетчик для справа пункта меню?
Как на картинке:
Или как в приложении GMail.
Новый NavigationView в новой Библиотеке поддержки дизайна отлично работает.
Они используют " пункты меню" для отображения параметров.
Но как я могу отобразить счетчик для справа пункта меню?
Как на картинке:
Или как в приложении GMail.
Начиная с версии 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()
.
Найдите пункт меню и установите счетчик:
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");
}