Как установить цвет значка MenuItem?

Я определил пункт меню, который имеет ShareActionProvider и поделиться белым значком, например:

<item
    android:icon="@drawable/ic_share_white_24dp"
    android:id="@+id/action_share"
    android:title="@string/action_share"
    android:orderInCategory="200"
    app:showAsAction="ifRoom"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

но когда я запускаю приложение, я получаю другой черный значок share. Как установить значок share, чтобы быть белым?

вот результат, который у меня есть enter image description here

7 ответов


это тематическая проблема. В зависимости от текущей темы вам нужно установить правильную тему наложения ActionBar. Поставщик действий считывает значение в теме (которое указывает, является ли тема темной или светлой), чтобы определить цвет значка.

Если ваша основная тема светлая, а панель действий темная, ваша панель действий / панель инструментов должна использовать тему ThemeOverlay.AppCompat.Dark.ActionBar.


значок фактически представленную ShareActionProvider и вы не можете изменить его afaik. Однако вы можете настроить цвет, установив textColorPrimary в своем стили.XML-код:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:theme="@style/MyActionBarTheme"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

<style name="MyActionBarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:textColorPrimary">#fa0</item>
</style>

для любых пользовательских значков вам придется покрасить их самостоятельно, т. е.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);

    for(int i = 0; i < menu.size(); i++){
        Drawable drawable = menu.getItem(i).getIcon();
        if(drawable != null) {
            drawable.mutate();
            drawable.setColorFilter(getResources().getColor(R.color.textColorPrimary), PorterDuff.Mode.SRC_ATOP);
        }
    }

    return true;
}

попробуйте это :

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.MENU, menu);

    // change color for icon 0 
    Drawable yourdrawable = menu.getItem(0).getIcon(); // change 0 with 1,2 ... 
    yourdrawable.mutate();
    yourdrawable.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
    return true;
}       

добавить app:iconTint="@color/yourcolor" в своем MenuItem для изменения цвета значка.

<item
    android:icon="@drawable/ic_share_white_24dp"
    android:id="@+id/action_share"
    android:title="@string/action_share"
    android:orderInCategory="200"
    app:iconTint="@color/yourcolor"
    app:showAsAction="ifRoom"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

это поведение ожидается, как ShareActionProvider is

ответственность за создание представлений, которые позволяют обмениваться данными, а также показать подменю с действиями общего доступа, если размещен элемент размещения в меню переполнения.

по данным в документации.

это означает, что у вас нет контроля над настройкой представления при его использовании.


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
    menuInflater.inflate(R.menu.menu_confirm, menu);
    MenuItem action_done = menu.findItem(R.id.action_done);
    action_done.setIcon(R.drawable.ic_filter);
    Utils.menuIconColor(action_done, Color.WHITE);
    super.onCreateOptionsMenu(menu, menuInflater);
}

public static void menuIconColor(MenuItem menuItem, int color) {
    Drawable drawable = menuItem.getIcon();
    if (drawable != null) {
        drawable.mutate();
        drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
    }
}

Я библиотека для достижения этого меню:

enter image description here

взгляните на мое репозиторий Github: https://github.com/lalongooo/permutas-sep/blob/master/app/src/main/java/com/permutassep/ui/ActivityMain.java#L171