Как изменить цвет текста элемента меню в Android? - PullRequest
144 голосов
/ 19 августа 2010

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

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

Ответы [ 25 ]

307 голосов
/ 08 сентября 2014

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

<item name="android:actionMenuTextColor">@color/your_color</item>
98 голосов
/ 04 апреля 2011

Кажется, что

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

77 голосов
/ 25 сентября 2013

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

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

Я сделал это программно так:

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;
}
26 голосов
/ 02 февраля 2016

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

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

15 голосов
/ 18 апреля 2017

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

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

Выше кода меняет цвет текста пунктов действий меню для API> = v21.

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

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

8 голосов
/ 28 октября 2015

Я использовал 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;
}
6 голосов
/ 22 мая 2012

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

    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.

6 голосов
/ 19 августа 2010

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

...