Как установить цвет значка 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"/>

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

Вот результат, который у меня есть

enter image description here

Ответы

Ответ 1

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

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

Ответ 2

Значок фактически предоставляется ShareActionProvider, и вы не можете изменить его afaik. Однако вы можете настроить цвет, установив textColorPrimary в свои styles.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;
}

Ответ 3

попробуйте следующее:

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

Ответ 4

Коротко и сладко Answer--> app: iconTint = "@color/yourcolor

добавьте 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"/>

Ответ 5

короткий ответ → используйте app:iconTint="?android:textColorPrimary" если вы хотите, чтобы цвет значка был белым, напишите: android:theme = "@style/ThemeOverlay.MaterialComponents.Dark.ActionBar" если хотите черный цвет, напишите: android:theme="@style/ThemeOverlay.MaterialComponents.Light" на панель инструментов

Ответ 6

Ожидается такое поведение, поскольку ShareActionProvider

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

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

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

Ответ 7

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