Как изменить цвет текста элемента меню в Android?

Можно ли изменить цвет фона элемента меню на Android?

Пожалуйста, дайте мне знать, есть ли у кого-нибудь решение. Последним вариантом будет, очевидно, настроить его, но есть ли способ изменить цвет текста без его настройки.

Ответ 1

Одна простая строка в вашей теме:)

<item name="android:actionMenuTextColor">@color/your_color</item>

Ответ 2

Кажется, что

  <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 измените стиль элементов списка, но не пунктов меню.

Ответ 3

Вы можете легко изменить цвет текста 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);
}

Ответ 4

Если вы используете новую панель инструментов с темой 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"/>

Ответ 5

Я сделал это программно следующим образом:

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;
}

Ответ 6

Если вы используете меню как <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"/>

Надеюсь, это поможет вам.

Ответ 7

как вы можете видеть в этом вопросе, вы должны:

<item name="android:textColorPrimary">yourColor</item>

Над кодом изменяется цвет текста элементов действия меню для API >= v21.

<item name="actionMenuTextColor">@android:color/holo_green_light</item>

Выше приведен код для API < V21

Ответ 8

Я использовал тэг 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;
}

Ответ 9

Короткий ответ: да. повезло тебе!
Для этого вам нужно переопределить некоторые стили стилей 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" и создайте свой собственный стиль. Затем свяжите его с вашим собственным селектором, чтобы сделать так, как вы хотите. Надеюсь, это поможет вам. Удачи!

Ответ 10

Спасибо за пример кода. Мне пришлось изменить его, чтобы он работал с контекстным меню. Это мое решение.

    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.

Ответ 11

ПРОСТОЙ способ сделать пользовательский цвет меню для отдельной панели инструментов, а не для 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>

Ответ 12

Меню параметров в android можно настроить для установки фона или изменения внешнего вида текста. Цвет фона и текста в меню не может быть изменен с помощью тем и стилей. Исходный код Android (data\res\layout\icon_menu_item_layout.xml) использует пользовательский элемент класса "com.android.internal.view.menu.IconMenuItem" Просмотр для макета меню. Мы можем внести изменения в вышеуказанный класс, чтобы настроить меню. Для достижения этого используйте класс LayoutInflater factory и установите цвет фона и текста для представления.


@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);
}


Ответ 13

Я нашел его Эврика!!

в теме приложения:

<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>

Приветствия;)

Ответ 14

Благодаря 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);
}

Hardcoded Color.BLACK может стать дополнительным параметром для метода setMenuTextColor. Кроме того, я использовал это только для пунктов меню, которые были android:showAsAction="never".

Ответ 15

в 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)

Ответ 16

Вы можете установить цвет программно.

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);
            }

        }
    });
}

Ответ 17

для изменения цвета текста пункта меню используйте код ниже

<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>

Ответ 18

Просто добавьте это в свою тему

<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

Ответ 19

@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

Ответ 20

Моя ситуация была с настройками цвета текста в меню настроек (главное меню приложения показывалось при нажатии кнопки меню).

Протестировано в API 16 с библиотекой appcompat-v7-27.0.2, темами AppCompatActivity for 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 используется для текста меню (я был почти уверен, что цвет был там).

  1. Я открыл этот файл, затем продублировал все цвета, поместил их под цвета по умолчанию, чтобы переопределить их, и присвоил им значение #f00.
  2. Запустите приложение.
  3. Многие элементы имели красный фон или цвет текста. И пункты меню тоже. Это было то, что мне было нужно.
  4. Удаление моих добавленных цветов блоков 5-10 линий я закончил с secondary_text_default_material_light цвета элементом.
  5. Выполняя поиск по этому имени в файлах в папке res (или лучше в res/colors), я обнаружил только одно вхождение в файле color/abc_secondary_text_material_light.xml (для этих операций я использовал Sublime Text, чтобы легче было найти нужную вещь).
  6. Обратно к values.xml 8 значений было найдено для @color/abc_secondary_text_material_light.
  7. Это была тема Light, так что осталось 4 в 2 темах: Base.ThemeOverlay.AppCompat.Light и Platform.AppCompat.Light.
  8. Первая тема была дочерней по отношению ко второй, поэтому в этом цветном ресурсе было только 2 атрибута: android:textColorSecondary и android:textColorTertiary в Base.ThemeOverlay.AppCompat.Light.
  9. Изменив их значения непосредственно в файле values.xml и запустив приложение, я обнаружил, что последний правильный атрибут был android:textColorSecondary.
  10. Затем мне понадобилась тема или другой атрибут, чтобы я мог изменить его в своем приложении style.xml (потому что моей темой был родитель Theme.AppCompat.Light а не ThemeOverlay.AppCompat.Light).
  11. Я искал в том же файле для Base.ThemeOverlay.AppCompat.Light. У него был ребенок ThemeOverlay.AppCompat.Light.
  12. В поисках ThemeOverlay.AppCompat.Light я нашел его использование в теме Base.Theme.AppCompat.Light.DarkActionBar в качестве actionBarPopupTheme атрибута actionBarPopupTheme.
  13. Тема моего приложения Theme.AppCompat.Light.DarkActionBar была дочерней для найденного Base.Theme.AppCompat.Light.DarkActionBar поэтому я мог без проблем использовать этот атрибут в моем файле styles.xml.
  14. Как видно из приведенного выше примера кода, я создал ThemeOverlay.AppCompat.Light тему из упомянутого ThemeOverlay.AppCompat.Light и изменил атрибут android:textColorSecondary.

https://i.imgur.com/LNfKdzC.png

Ответ 21

Sephy solution не работает. Можно переопределить внешний вид элемента меню опций, используя метод, описанный выше, но не элемент или меню. Для этого есть 3 способа:

  • Как изменить цвет фона в меню параметров?
  • Создайте собственное представление для отображения и переопределения onCreateOptionsMenu и onPrepareOptionsMenu для получения желаемых результатов. Я утверждаю это вообще, потому что вы можете вообще делать все, что захотите, в этих методах, но вы, вероятно, не захотите звонить в super().
  • Скопируйте код из SDK с открытым исходным кодом и настройте для своего поведения. Реализация меню по умолчанию, используемая Activity, больше не будет применяться.

См. Проблема 4441: Тема меню дополнительных опций для получения дополнительных сведений.

Ответ 22

попробуйте этот код....

 @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);
    }

Ответ 23

Добавление этого в мой styles.xml работало для меня

<item name="android:textColorPrimary">?android:attr/textColorPrimaryInverse</item>

Ответ 24

Вот как вы можете покрасить определенный элемент меню с цветом, работает для всех уровней 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);
}

Ответ 25

Для изменения цвета текста вы можете просто настроить собственное представление для MenuItem, а затем вы можете определить цвет текста.

Пример кода: MenuItem.setActionView()

Ответ 26

Если вы хотите установить цвет для отдельного пункта меню, настройка темы панели инструментов не является правильным решением. Для этого вы можете использовать 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);
    button.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.