Как подкрасить один значок NavigationView MenuItem? - PullRequest
1 голос
/ 16 мая 2019

У меня есть NavigationView с установленными селекторами как для оттенка значка, так и для цвета текста.Это выглядит следующим образом.

<android.support.design.widget.NavigationView
            android:id="@+id/main_nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start|center"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:itemIconTint="@color/nav_drawer_list_selector"
            app:itemTextColor="@color/nav_drawer_list_selector" />

У меня есть несколько пунктов меню, отображаемых в этом NavigationView.Я хочу, чтобы один из них был окрашен по-другому.Я могу получить доступ к элементу следующим образом:

Menu navMenu = navigationView.getMenu();
MenuItem noAdsItem = navMenu.findItem(R.id.item_navigation_purchase_no_ads);

Я испробовал все следующие подходы.

  1. setColorFilter ()
noAdsItem.getIcon().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
Завершение рисования и настройка оттенка
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.ic_no_ads);

Drawable drawable = noAdsItem.getIcon();
Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(wrappedDrawable, ContextCompat.getColor(this, R.color.content_brand));
Отключение рисования и установка оттенка
drawable.mutate();
drawable.setColorFilter(ContextCompat.getColor(this, R.color.content_brand), PorterDuff.Mode.SRC_IN);
drawable.setTint(ContextCompat.getColor(this, R.color.content_brand));

Я пытался использовать цветной значок в качестве ресурса;он отменяется селектором.Я попытался удалить селектор itemIconTint и затем тонировать значок программно.Все эти попытки были безуспешными.

Я знаю, что возможно, например, раскрасить текст.Я использовал подход SpannableString, и он сработал.

SpannableString spanString = new SpannableString(menuItem.getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(this, color)), 0, spanString.length(), 0);
menuItem.setTitle(spanString);

Я использую Android Pie на Pixel 3XL.Есть идеи?Заранее спасибо.

...