Можно ли изменить цвет фона элемента меню в Android?
Пожалуйста, дайте мне знать, если у кого-нибудь есть решение для этого. Последний вариант, очевидно, будет настраивать его, но есть ли способ изменить цвет текста без его настройки.
Можно ли изменить цвет фона элемента меню в Android?
Пожалуйста, дайте мне знать, если у кого-нибудь есть решение для этого. Последний вариант, очевидно, будет настраивать его, но есть ли способ изменить цвет текста без его настройки.
Ответы:
Одна простая строчка в вашей теме :)
<item name="android:actionMenuTextColor">@color/your_color</item>
actionBarStyle
например. Это не будет работать внутри actionBarStyle
, даже если это кажется логичным!
<item name="actionMenuTextColor">@color/your_color</item>
не используйте пространство имен Android
theme
атрибут на панели инструментов, это работает.
Кажется, что
<item name="android:itemTextAppearance">@style/myCustomMenuTextAppearance</item>
в моей теме и
<style name="myCustomMenuTextAppearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@android:color/primary_text_dark</item>
</style>
в styles.xml изменить стиль элементов списка, но не пунктов меню.
android:itemTextAppearance
Атрибут не может быть помещен в стиле , чей родитель , parent="@android:style/Widget.Holo.ListPopupWindow"
так что не будет отображаться корректно. Он должен быть в стиле верхнего уровня, как тот, чей родитель android:Theme.Holo.Light.DarkActionBar
.
Theme.Holo
или Theme.Holo.Light.DarkActionBar
или аналогичный.
Вы можете легко изменить цвет MenuItem
текста, используя SpannableString
вместо String
.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.your_menu, menu);
int positionOfMenuItem = 0; // or whatever...
MenuItem item = menu.getItem(positionOfMenuItem);
SpannableString s = new SpannableString("My red MenuItem");
s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
item.setTitle(s);
}
menu.findItem(R.id.menu_item_id);
вместоmenu.getItem()
Если вы используете новую панель инструментов с темой Theme.AppCompat.Light.NoActionBar
, вы можете оформить ее следующим образом.
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:textColorPrimary">@color/my_color1</item>
<item name="android:textColorSecondary">@color/my_color2</item>
<item name="android:textColor">@color/my_color3</item>
</style>`
Согласно полученным результатам,
android:textColorPrimary
это цвет текста, отображающий название вашей активности, который является основным текстом панели инструментов.
android:textColorSecondary
цвет текста для кнопки субтитров и дополнительных параметров (3 точки). (Да, он изменил свой цвет в соответствии с этим свойством!)
android:textColor
- цвет для всего другого текста, включая меню.
Наконец, установите тему на панель инструментов
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:theme="@style/ToolbarTheme"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"/>
android:actionMenuTextColor
(см. Stackoverflow.com/a/5538709/423105 ).
Если вы используете меню как, <android.support.design.widget.NavigationView />
то просто добавьте строку ниже NavigationView
:
app:itemTextColor="your color"
Также доступен colorTint для значка, он также переопределит цвет для вашего значка. Для этого вы должны добавить строку ниже:
app:itemIconTint="your color"
Пример:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:itemTextColor="@color/color_white"
app:itemIconTint="@color/color_white"
android:background="@color/colorPrimary"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"/>
Надеюсь, это поможет вам.
Я сделал это программно так:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.changeip_card_menu, menu);
for(int i = 0; i < menu.size(); i++) {
MenuItem item = menu.getItem(i);
SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0, spanString.length(), 0); //fix the color to white
item.setTitle(spanString);
}
return true;
}
как вы можете видеть в этом вопросе, вы должны:
<item name="android:textColorPrimary">yourColor</item>
Код выше меняет цвет текста пунктов действий меню для API> = v21.
<item name="actionMenuTextColor">@android:color/holo_green_light</item>
Выше приведен код для API <v21
Я использовал HTML-тег, чтобы изменить цвет текста отдельного элемента, когда элемент меню раздут. Надеюсь, это будет полезно.
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.findItem(R.id.main_settings).setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>"));
return true;
}
ПРОСТОЙ способ сделать пользовательский цвет меню для одной панели инструментов, а не для AppTheme
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay.MenuBlue">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"/>
</android.support.design.widget.AppBarLayout>
обычная панель инструментов на styles.xml
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
наш собственный стиль панели инструментов
<style name="AppTheme.AppBarOverlay.MenuBlue">
<item name="actionMenuTextColor">@color/blue</item>
</style>
в Kotlin я написал эти расширения:
fun MenuItem.setTitleColor(color: Int) {
val hexColor = Integer.toHexString(color).toUpperCase().substring(2)
val html = "<font color='#$hexColor'>$title</font>"
this.title = html.parseAsHtml()
}
@Suppress("DEPRECATION")
fun String.parseAsHtml(): Spanned {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(this)
}
}
и используется так:
menu.findItem(R.id.main_settings).setTitleColor(Color.RED)
Краткий ответ: да. повезло тебе!
Для этого вам нужно переопределить некоторые стили стилей Android по умолчанию:
Сначала посмотрите на определение тем в Android:
<style name="Theme.IconMenu">
<!-- Menu/item attributes -->
<item name="android:itemTextAppearance">@android:style/TextAppearance.Widget.IconMenu.Item</item>
<item name="android:itemBackground">@android:drawable/menu_selector</item>
<item name="android:itemIconDisabledAlpha">?android:attr/disabledAlpha</item>
<item name="android:horizontalDivider">@android:drawable/divider_horizontal_bright</item>
<item name="android:verticalDivider">@android:drawable/divider_vertical_bright</item>
<item name="android:windowAnimationStyle">@android:style/Animation.OptionsPanel</item>
<item name="android:moreIcon">@android:drawable/ic_menu_more</item>
<item name="android:background">@null</item>
</style>
Итак, внешний вид текста в меню находится @android:style/TextAppearance.Widget.IconMenu.Item
сейчас, в определении стилей :
<style name="TextAppearance.Widget.IconMenu.Item" parent="TextAppearance.Small">
<item name="android:textColor">?textColorPrimaryInverse</item>
</style>
Итак, теперь у нас есть название рассматриваемого цвета, если вы посмотрите в папке цвета ресурсов системы:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@android:color/bright_foreground_light_disabled" />
<item android:state_window_focused="false" android:color="@android:color/bright_foreground_light" />
<item android:state_pressed="true" android:color="@android:color/bright_foreground_light" />
<item android:state_selected="true" android:color="@android:color/bright_foreground_light" />
<item android:color="@android:color/bright_foreground_light" />
<!-- not selected -->
</selector>
Наконец, вот что вам нужно сделать:
Переопределите «TextAppearance.Widget.IconMenu.Item» и создайте свой собственный стиль. Затем свяжите его с вашим собственным селектором, чтобы сделать его так, как вы хотите. Надеюсь, это поможет вам. Удачи!
Меню параметров в Android можно настроить, чтобы установить фон или изменить внешний вид текста. Фон и цвет текста в меню не могут быть изменены с помощью тем и стилей. Исходный код Android (data \ res \ layout \ icon_menu_item_layout.xml) использует пользовательский элемент класса «com.android.internal.view.menu.IconMenuItem» View для макета меню. Мы можем внести изменения в вышеупомянутый класс, чтобы настроить меню. Чтобы добиться того же, используйте фабричный класс LayoutInflater и установите цвет фона и текста для вида.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu);
getLayoutInflater().setFactory(new Factory() {
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
if (name .equalsIgnoreCase(“com.android.internal.view.menu.IconMenuItemView”)) {
try{
LayoutInflater f = getLayoutInflater();
final View view = f.createView(name, null, attrs);
new Handler().post(new Runnable() {
public void run() {
// set the background drawable
view .setBackgroundResource(R.drawable.my_ac_menu_background);
// set the text color
((TextView) view).setTextColor(Color.WHITE);
}
});
return view;
} catch (InflateException e) {
} catch (ClassNotFoundException e) {}
}
return null;
}
});
return super.onCreateOptionsMenu(menu);
}
03-23 19:45:25.134: E/AndroidRuntime(26761): java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
Спасибо за пример кода. Мне пришлось изменить его, чтобы заставить его работать с контекстным меню. Это моё решение.
static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class};
class MenuColorFix implements LayoutInflater.Factory {
public View onCreateView(String name, Context context, AttributeSet attrs) {
if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) {
try {
Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class);
Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature);
final ViewGroup view = constructor.newInstance(new Object[]{context,attrs});
new Handler().post(new Runnable() {
public void run() {
try {
view.setBackgroundColor(Color.BLACK);
List<View> children = getAllChildren(view);
for(int i = 0; i< children.size(); i++) {
View child = children.get(i);
if ( child instanceof TextView ) {
((TextView)child).setTextColor(Color.WHITE);
}
}
}
catch (Exception e) {
Log.i(TAG, "Caught Exception!",e);
}
}
});
return view;
}
catch (Exception e) {
Log.i(TAG, "Caught Exception!",e);
}
}
return null;
}
}
public List<View> getAllChildren(ViewGroup vg) {
ArrayList<View> result = new ArrayList<View>();
for ( int i = 0; i < vg.getChildCount(); i++ ) {
View child = vg.getChildAt(i);
if ( child instanceof ViewGroup) {
result.addAll(getAllChildren((ViewGroup)child));
}
else {
result.add(child);
}
}
return result;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
LayoutInflater lInflater = getLayoutInflater();
if ( lInflater.getFactory() == null ) {
lInflater.setFactory(new MenuColorFix());
}
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.myMenu, menu);
}
Для меня это работает с Android 1.6, 2.03 и 4.03.
я нашел это Эврика!
в теме вашего приложения:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ActionBarTheme</item>
<!-- backward compatibility -->
<item name="actionBarStyle">@style/ActionBarTheme</item>
</style>
вот ваша тема панели действий:
<style name="ActionBarTheme" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="android:background">@color/actionbar_bg_color</item>
<item name="popupTheme">@style/ActionBarPopupTheme</item
<!-- backward compatibility -->
<item name="background">@color/actionbar_bg_color</item>
</style>
и вот ваша всплывающая тема:
<style name="ActionBarPopupTheme">
<item name="android:textColor">@color/menu_text_color</item>
<item name="android:background">@color/menu_bg_color</item>
</style>
Ура;)
для изменения цвета текста пункта меню используйте код ниже
<style name="AppToolbar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/menu_item_color</item>
</style>
где
<style name="menu_item_color">
<item name="android:textColor">@color/app_font_color</item>
</style>
Благодаря max.musterman, вот решение, которое я получил для работы на 22 уровне:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchMenuItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
setMenuTextColor(menu, R.id.displaySummary, R.string.show_summary);
setMenuTextColor(menu, R.id.about, R.string.text_about);
setMenuTextColor(menu, R.id.importExport, R.string.import_export);
setMenuTextColor(menu, R.id.preferences, R.string.settings);
return true;
}
private void setMenuTextColor(Menu menu, int menuResource, int menuTextResource) {
MenuItem item = menu.findItem(menuResource);
SpannableString s = new SpannableString(getString(menuTextResource));
s.setSpan(new ForegroundColorSpan(Color.BLACK), 0, s.length(), 0);
item.setTitle(s);
}
Жесткое кодирование Color.BLACK
может стать дополнительным параметром setMenuTextColor
метода. Кроме того, я использовал это только для пунктов меню, которые были android:showAsAction="never"
.
Вы можете установить цвет программно.
private static void setMenuTextColor(final Context context, final Toolbar toolbar, final int menuResId, final int colorRes) {
toolbar.post(new Runnable() {
@Override
public void run() {
View settingsMenuItem = toolbar.findViewById(menuResId);
if (settingsMenuItem instanceof TextView) {
if (DEBUG) {
Log.i(TAG, "setMenuTextColor textview");
}
TextView tv = (TextView) settingsMenuItem;
tv.setTextColor(ContextCompat.getColor(context, colorRes));
} else { // you can ignore this branch, because usually there is not the situation
Menu menu = toolbar.getMenu();
MenuItem item = menu.findItem(menuResId);
SpannableString s = new SpannableString(item.getTitle());
s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, colorRes)), 0, s.length(), 0);
item.setTitle(s);
}
}
});
}
Просто добавьте это в свою тему
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/AppTheme.ItemTextStyle</item>
</style>
<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@color/orange_500</item>
</style>
Проверено на API 21
<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">
, в противном случае текст кажется слишком маленьким в меню переполнения. Также обратите внимание, что эта техника работает только на Android 5 и выше.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.search, menu);
MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
SearchView searchView = (SearchView) myActionMenuItem.getActionView();
EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setTextColor(Color.WHITE); //You color here
Моя ситуация была настройкой цвета текста в меню настроек (главное меню приложения показывалось при нажатии кнопки меню).
Протестировано в API 16 с библиотекой appcompat-v7-27.0.2 , AppCompatActivity
для MainActivity
и AppCompat
темой для приложения в AndroidManifest.xml .
styles.xml :
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="actionBarPopupTheme">@style/PopupTheme</item>
</style>
<style name="PopupTheme" parent="@style/ThemeOverlay.AppCompat.Light">
<item name="android:textColorSecondary">#f00</item>
</style>
Не знаю, textColorSecondary
влияет ли это на другие элементы, но он контролирует цвет текста меню.
Я искал несколько примеров по этой теме, но все готовые к использованию фрагменты не работали.
Поэтому я хотел исследовать его с помощью исходного кода для библиотеки appcompat-v7 (в частности, с папкой res пакета .aar ).
Хотя в моем случае я использовал Eclipse с разнесенными зависимостями .aar . Так что я мог бы изменить стили по умолчанию и проверить результаты. Не знаю, как взорвать библиотеки для использования с Gradle или Android Studio напрямую. Это заслуживает другого потока исследования.
Поэтому моей целью было найти какой цвет в файле res / values / values.xml для текста меню (я был почти уверен, что цвет был там).
#f00
значение.secondary_text_default_material_light
цветным элементом.@color/abc_secondary_text_material_light
.Base.ThemeOverlay.AppCompat.Light
иPlatform.AppCompat.Light
.android:textColorSecondary
и android:textColorTertiary
в Base.ThemeOverlay.AppCompat.Light
.android:textColorSecondary
.Theme.AppCompat.Light
а неThemeOverlay.AppCompat.Light
).Base.ThemeOverlay.AppCompat.Light
. У него был ребенокThemeOverlay.AppCompat.Light
.ThemeOverlay.AppCompat.Light
я нашел его использование в Base.Theme.AppCompat.Light.DarkActionBar
теме какactionBarPopupTheme
значения атрибута.Theme.AppCompat.Light.DarkActionBar
была дочерней из найденного, Base.Theme.AppCompat.Light.DarkActionBar
поэтому я мог использовать этот атрибут в моем styles.xml без проблем .ThemeOverlay.AppCompat.Light
и изменил android:textColorSecondary
атрибут.Решение Сефи не работает. Можно переопределить внешний вид текста пункта меню параметров, используя метод, описанный выше, но не пункт или меню. Для этого есть по существу 3 способа:
См. Выпуск 4441: Тема меню пользовательских параметров для получения дополнительной информации.
попробуй этот код ....
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu);
getLayoutInflater().setFactory(new Factory() {
@Override
public View onCreateView(String name, Context context,
AttributeSet attrs) {
if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
try {
LayoutInflater f = getLayoutInflater();
final View view = f.createView(name, null, attrs);
new Handler().post(new Runnable() {
public void run() {
// set the background drawable
view.setBackgroundResource(R.drawable.my_ac_menu_background);
// set the text color
((TextView) view).setTextColor(Color.WHITE);
}
});
return view;
} catch (InflateException e) {
} catch (ClassNotFoundException e) {
}
}
return null;
}
});
return super.onCreateOptionsMenu(menu);
}
java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
Если вы хотите установить цвет для отдельного пункта меню, настройка темы панели инструментов не является правильным решением. Для этого вы можете использовать android: actionLayout и представление действий для пункта меню.
Сначала создайте файл макета XML для вида действия. В этом примере мы используем кнопку как вид действия:
menu_button.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/menuButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Done"
android:textColor="?android:attr/colorAccent"
style="?android:attr/buttonBarButtonStyle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
В приведенном выше фрагменте кода мы используем android:textColor="?android:attr/colorAccent"
для настройки цвета текста кнопки.
Затем в вашем XML-файле макета для меню, включите app:actionLayout="@layout/menu_button"
как показано ниже:
main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menuItem"
android:title=""
app:actionLayout="@layout/menu_button"
app:showAsAction="always"/>
</menu>
Последний переопределите onCreateOptionsMenu()
метод в вашей деятельности:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem(R.id.menuItem);
Button saveButton = item.getActionView().findViewById(R.id.menuButton);
saveButton.setOnClickListener(view -> {
// Do something
});
return true;
}
... или фрагмент:
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater){
inflater.inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem(R.id.menuItem);
Button saveButton = item.getActionView().findViewById(R.id.menuButton);
button.setOnClickListener(view -> {
// Do something
});
}
Подробнее о видах действий см. В руководстве разработчика Android .
Вот как вы можете закрасить определенный пункт меню цветом, работает для всех уровней API:
public static void setToolbarMenuItemTextColor(final Toolbar toolbar,
final @ColorRes int color,
@IdRes final int resId) {
if (toolbar != null) {
for (int i = 0; i < toolbar.getChildCount(); i++) {
final View view = toolbar.getChildAt(i);
if (view instanceof ActionMenuView) {
final ActionMenuView actionMenuView = (ActionMenuView) view;
// view children are accessible only after layout-ing
actionMenuView.post(new Runnable() {
@Override
public void run() {
for (int j = 0; j < actionMenuView.getChildCount(); j++) {
final View innerView = actionMenuView.getChildAt(j);
if (innerView instanceof ActionMenuItemView) {
final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
if (resId == itemView.getId()) {
itemView.setTextColor(ContextCompat.getColor(toolbar.getContext(), color));
}
}
}
}
});
}
}
}
}
Тем самым вы потеряете эффект селектора фона, поэтому вот код для применения пользовательского селектора фона ко всем дочерним элементам меню.
public static void setToolbarMenuItemsBackgroundSelector(final Context context,
final Toolbar toolbar) {
if (toolbar != null) {
for (int i = 0; i < toolbar.getChildCount(); i++) {
final View view = toolbar.getChildAt(i);
if (view instanceof ImageButton) {
// left toolbar icon (navigation, hamburger, ...)
UiHelper.setViewBackgroundSelector(context, view);
} else if (view instanceof ActionMenuView) {
final ActionMenuView actionMenuView = (ActionMenuView) view;
// view children are accessible only after layout-ing
actionMenuView.post(new Runnable() {
@Override
public void run() {
for (int j = 0; j < actionMenuView.getChildCount(); j++) {
final View innerView = actionMenuView.getChildAt(j);
if (innerView instanceof ActionMenuItemView) {
// text item views
final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
UiHelper.setViewBackgroundSelector(context, itemView);
// icon item views
for (int k = 0; k < itemView.getCompoundDrawables().length; k++) {
if (itemView.getCompoundDrawables()[k] != null) {
UiHelper.setViewBackgroundSelector(context, itemView);
}
}
}
}
}
});
}
}
}
}
Вот вспомогательная функция также:
public static void setViewBackgroundSelector(@NonNull Context context, @NonNull View itemView) {
int[] attrs = new int[]{R.attr.selectableItemBackgroundBorderless};
TypedArray ta = context.obtainStyledAttributes(attrs);
Drawable drawable = ta.getDrawable(0);
ta.recycle();
ViewCompat.setBackground(itemView, drawable);
}
Для изменения цвета текста вы можете просто установить пользовательский вид для MenuItem, а затем вы можете определить цвет для текста.
Пример кода: MenuItem.setActionView ()