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

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

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

Ответы [ 25 ]

1 голос
/ 19 июля 2018

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

<item name="android:textColorPrimary">?android:attr/textColorPrimaryInverse</item>
1 голос
/ 17 октября 2010

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

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

См. Issue 4441: Тема меню пользовательских параметров для получения дополнительной информации.

1 голос
/ 19 августа 2012

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

 @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);
    }
0 голосов
/ 24 августа 2017

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

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

0 голосов
/ 19 февраля 2017

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