Як змінити колір тексту елемента меню в 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.