Як змінити колір тексту елемента меню в Android?


175

Чи можу я змінити колір тла елемента меню в Android?

Будь ласка, дайте мені знати, чи є хтось із цього рішення. Останній варіант, очевидно, буде налаштувати його, але чи є спосіб змінити колір тексту, не налаштовуючи його.


Хтось може дозволити мені знати рішення цього?
— суніль

3
Ви хочете змінити колір тексту, колір тла перегляду тексту? або обидва? Обидва різні речі. Будь ласка, перегляньте питання.
— Абхінав Саксен

Відповіді:


335

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

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

19
ПРИМІТКА. ЦЕ ОБОВ'ЯЗКОВО вводиться в основне визначення теми для вашого додатка, а не в actionBarStyleприклад. Це не буде працювати всередині actionBarStyle, хоча це здається логічним!
— Колін М.

47
Для підтримки нижчих версій API <item name="actionMenuTextColor">@color/your_color</item>не використовуйте простір імен Android
— alex.p

5
@ColinM. Він повинен йти в вигляді теми. Якщо ви встановите themeатрибут на панелі інструментів, це працює.
— ДарійL

2
Не працював для мене ні з android, ні з ним: простір імен. Він був доданий до основної теми програми.
— racs

2
Я все ще не можу змінити колір тексту. У моїй загальній темі тексту просто перевага. Будь-яка допомога? Жодна з цих відповідей не працює.
— Девід П

114

Здається, що

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


5
Це чудово підходить для пунктів контекстного меню (не для пунктів меню з кнопки меню), що саме я шукав. Набагато простіше, ніж у всьому безладному макеті.
— кругляки

android:itemTextAppearanceАтрибут не може бути поміщений в стилі , чий батько , parent="@android:style/Widget.Holo.ListPopupWindow"так що не буде доступний широкому коректно. Він повинен бути в стилі вищого рівня, як той, чий батько є android:Theme.Holo.Light.DarkActionBar.
— toobsco42

Де слід додати <item name = "android: itemTextAppearance"> @ style / myCustomMenuTextApearance </item>?
— Bagusflyer

@bagusflyer слід додати , що в кореневому стилі вашої теми, тобто стиль , який є нащадком Theme.Holoабо Theme.Holo.Light.DarkActionBarабо аналогічний.
— Таш Пемхіва

86

Ви можете легко змінити колір 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);
}

10
Це працювало для мене і в 4.4, і в 5+, використовуючи menu.findItem(R.id.menu_item_id);замістьmenu.getItem()
— haagmm

1
Працював і для мене [використовуючи findItem (...)].
— запаморочив

6
рішення працюють лише для елемента в переповненні .... я не хочу змінювати колір елемента, який видно, встановивши showAsAction: "завжди"
— Junaid

56

Якщо ви використовуєте нову Панель інструментів із темою 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: textColorPrimary, android: textColorSecondary, ні android: textColor, схоже, не впливають на них.
— LarsH

У відповідь на моє запитання в попередньому коментарі: android:actionMenuTextColor(див. Stackoverflow.com/a/5538709/423105 ).
— LarsH

32

Якщо ви використовуєте меню, <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"/>

Сподіваюся, це допоможе вам.


Це змінило елементи, які вкладені в інший елемент, але він не змінив елемент, що містить інші елементи. Чи знаєте ви, як я міг їх також змінити?
— Dinu Nicolae

@DinuNicolae Чи можете ви, будь ласка, опублікувати свій приклад знімка екрана? Або надайте більш детальну інформацію.
— Міхір Триведі

У мене було <item> <menu> <всередині предметів> </menu> </item> і змінився лише колір предметів всередині
— Dinu Nicolae,

31

Про це я пішов програмно так:

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

2
Ваша відповідь допомогла мені встановити жирний текст MenuItem. (s.setSpan (новий StyleSpan (android.graphics.Typeface.BOLD), 0, s.length (), 0); Дякую!
— Arkadiusz Cieśliński

Це рішення допомогло моєму питанню. Мені це подобається, оскільки це не залежатиме від умовних умов.
— Tomcat

15

як ви бачите в цьому питанні, ви повинні:

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

Наведений вище код змінює колір тексту пунктів дії меню для API> = v21.

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

Вище - код для API <v21


Дякую. Це слід прийняти. Це просто і легко
— Pooja

10

Я використовував тег 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;
}

1
Це не працює для мене на Marshmallow. Текст застосовується, але не колір.
— Оллі С

Щодо Marshmallow, напевно, він не працює з тієї ж причини, що вказана у відповіді max.mustermann, "рішення працюють лише для елемента, що переповнюється".
— Jose_GD

10

Найпростіший спосіб зробити спеціальне кольорове меню для однієї панелі інструментів, а не для 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>

Чудово працює! Найкраща відповідь.
— bebe

9

в Котліні я написав ці розширення:

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)

Дійсно, як це рішення, дуже акуратне!
— Джаміль Наваз

Спасибі, просте та швидке рішення. Для API> 24 він працює без цієї другої функції ext
— laszlo

7

Коротка відповідь - ТАК. щасливчик!
Для цього вам потрібно змінити деякі стилі стилів 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" та створіть свій власний стиль. Потім прив’яжіть його до власного селектора, щоб зробити так, як вам хочеться. Сподіваюся, це вам допоможе. Удачі!


Дякуємо за відповідь. Я зробив те, що ви запропонували, але це не змінило колір пункту меню
— суніль,

Насправді я просто зрозумів, прочитавши більше матеріалів меню, що це набагато складніше, ніж я думав. Якщо ви не хочете створити своє власне повне користувацьке меню ... Для цього знадобиться ще читання для мене, я продовжуватиму Ви розмістили тут, якщо я знайду більше.
— Sephy

Неможливо змінити "TextAppearance.Widget.IconMenu.Item".
— peceps

Ця відповідь вводить в оману .. тому висновок такий: він не працює і досягти набагато важче / довго звинуваченого, ніж вважалося спочатку?
— speedynomads

6

Меню параметрів в Android можна налаштувати для встановлення фону або зміни зовнішнього вигляду тексту. Колір фону та тексту в меню неможливо змінити за допомогою тем та стилів. Для вихідного коду андроїда (data \ res \ layout \ icon_menu_item_layout.xml) використовується спеціальний елемент класу "com.android.internal.view.menu.IconMenuItem" Перегляд макета меню. Ми можемо внести зміни у вищевказаний клас, щоб налаштувати меню. Щоб досягти цього, використовуйте заводський клас 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);
}



3
03-23 19:45:25.134: E/AndroidRuntime(26761): java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
— До Кра

Це працює вперше. Коли ви вдруге відкриєте меню, ви отримуєте виняток.
— LoveForDroid

6

Дякуємо за приклад коду. Мені довелося його змінити, перейти до роботи з контекстним меню. Це моє рішення.

    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.


Якщо ви робите вищезгадане, тоді вам варто просто поглянути на використання рішення Маркуса Волшона. Набагато простіше.
— кругляки

Розчин xml не працює для мене, наприклад, 2.3.x, але це працює як шарм - також на 4.x
— sunlock

Це рішення спрацювало найкраще. Довелося також захопити android.support.v7.internal.view.menu.ListMenuItemView, щоб отримати стилі, застосовані на пристроях за допомогою бібліотеки сумісності
— Chiatar

Це виправлення не працюватиме з Google Maps v2 - супер метод повинен бути викликаний 1-м, щоб карти відображалися правильно.
— Чіатар

5

я знайшов це Юріка !!

у темі додатка:

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

Ура;)


5

щоб змінити колір тексту тексту, використовуйте нижче код

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

4

Завдяки 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".


Не працює для мене на API 24. Будь-які ідеї? Був затриманий на цьому днями ... смішно!
— Девід П

Не знаєте, що вам сказати. Для мене це добре працює в API 25.
— lightkeeper

3

Ви можете встановити колір програмно.

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

        }
    });
}

3

Додавання цього до мого styles.xml працювало на мене

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

2

Просто додайте це до своєї теми

<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


2
Краще використовувати <style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">, інакше текст відображається занадто мало в меню переповнення. Також зауважте, що ця методика працює лише на Android 5 і вище.
— Mr-IDE

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

1
поясніть свою відповідь
— Coder

1
Що робити, якщо це не SearchView?
— нач

2

Моєю ситуацією був колір тексту в меню параметрів (головне меню програми показано на натисканні кнопки меню).

Тестовано в 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 використовується для тексту меню (я був майже впевнений, що колір там є).

  1. Я відкрив цей файл, потім копіював усі кольори, поставив їх нижче за замовчуванням, щоб переосмислити їх і призначити #f00 усім їм значення.
  2. Запустіть додаток.
  3. Багато елементів мали червоний фон або колір тексту. І пункти меню теж. Це було те, що мені було потрібно.
  4. Видалення доданих кольорів блоками 5-10 рядків я закінчила secondary_text_default_material_light кольоровим елементом.
  5. Шукаючи це ім’я у файлах у папці res (або краще у res / color ), я знайшов лише одне явище у кольорі / abc_secondary_text_material_light.xml файлі (я використовував Sublime Text для цих операцій, тому простіше знайти те, що мені потрібно).
  6. Назад до значень.xml було знайдено 8 звичаїв для@color/abc_secondary_text_material_light .
  7. Це була тема світла, тому 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.LightI я знайшов його використання в Base.Theme.AppCompat.Light.DarkActionBarтемі як actionBarPopupThemeзначення атрибута.
  13. Тема мого додатка Theme.AppCompat.Light.DarkActionBarбула дитиною знайденого, Base.Theme.AppCompat.Light.DarkActionBarщоб я міг без проблем використовувати цей атрибут у своїх styles.xml .
  14. Як видно з прикладу коду вище, я створив дочірню тему із згаданого ThemeOverlay.AppCompat.Lightта змінив android:textColorSecondaryатрибут.

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


1

Рішення Sephy не працює. Можна змінити зовнішній вигляд тексту пункту меню за допомогою описаного вище методу, але не пункт або меню. Для цього є 3 принципи:

  1. Як змінити колір фону меню параметрів?
  2. Напишіть власний вигляд, щоб відобразити та замінити onCreateOptionsMenu та onPrepareOptionsMenu, щоб отримати потрібні результати. Я констатую це загалом, тому що ви, як правило, можете робити все, що завгодно в цих методах, але ви, ймовірно, не захочете зателефонувати в super ().
  3. Скопіюйте код із відкритого коду SDK та налаштуйте свою поведінку. Реалізація меню за замовчуванням, яку використовує Діяльність, більше не застосовуватиметься.

Див. Випуск 4441: Тема меню користувальницьких опцій для додаткових доказів.


Ще раз повторюю ... Рішення Sephy працює для пункту меню TextAppearance, хоча те, що я зробив, замінює за замовчуванням через themes.xml. Крім того, №2 або №3 вище повинні знати, що виклик до супер # onCreateOptionsMenu / super # onPrepareOptionsMenu призначений для розміщення елементів системного меню ..., як зазначено в javadoc для Activity # onCreateOptionsMenu (). Це може не мати значення для вашої програми.
— Упертий

Що описує Sephy - це мати це у своїх themes.xml: <item name = "android: itemTextAppearance"> @ style / Text_MenuItemText </item> Потім визначте щось подібне у ваших стилях.xml: <style name = "Text_MenuItemText" > <item name = "android: textSize"> 12dp </item> <item name = "android: textColor"> # FFFFFF </item> </style> Це так просто, як це стає. Це ви мали на увазі? Налаштування більш глибоких параметрів меню зовсім непросте, але я маю намір найближчим часом опублікувати статтю в блозі.
— Наполегливий

1

спробуйте цей код ....

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

1
на Android> 4.0 Я отримуюjava.lang.IllegalStateException: A factory has already been set on this LayoutInflater
— До

1

Якщо ви хочете встановити колір для окремого пункту меню, налаштування теми панелі інструментів не є правильним рішенням. Для цього ви можете скористатися андроїдом: 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 .


0

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

0

Для зміни кольору тексту ви можете просто встановити спеціальний вигляд меню Menu, а потім визначити колір тексту.

Приклад коду: MenuItem.setActionView ()


Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
— Mischa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.