Программно изменить значок ActionBar

Я возвращаюсь к своей основной деятельности из фрагмента, и для некоторой логики мне нужно изменить внешний вид значка в меню панели действий.

Это меню на панели действий:

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="it.gn.sfa.Main">


    <item
        android:id="@+id/action_search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:title="Search" />
    <item
        android:id="@+id/action_filter"
        android:icon="@drawable/ic_action_filter_empty"
        android:showAsAction="ifRoom"
        android:title="Filter" />
    <item
        android:id="@+id/action_new"
        android:icon="@drawable/ic_action_new"
        android:showAsAction="ifRoom"
        android:title="New" />

</menu>

Мне нужно изменить второй элемент (тот, у которого id = action_filter). Я пробовал разные решения, найденные в другом сообщении. Самый популярный -

mOptionsMenu.getItem(0).setIcon(getResources().getDrawable(R.drawable.ic_action_filter));

но вроде не работает.

С другой стороны getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_action_filter)); меняет логотип, а я этого не хочу.

Как я могу изменить только второй пункт в меню?


person Luca    schedule 02.09.2014    source источник
comment
Можете ли вы опубликовать весь код, связанный с mOptionsMenu? В частности, когда и как вы создаете экземпляр этой переменной mOptionsMenu   -  person Víctor Albertos    schedule 02.09.2014
comment
Я создаю mOptionsMenu в onCreateOptionsMenu (меню меню): mOptionsMenu = menu.   -  person Luca    schedule 02.09.2014
comment
Проверьте мой ответ здесь: stackoverflow.com/a/28478791/1038702   -  person David    schedule 12.02.2015


Ответы (4)


Попробуй это

mOptionsMenu.findItem(R.id.action_filter).setIcon(R.drawable.ic_action_filter);

Предполагая, что у вас все настроено для mOptionsMenu в

private Menu mOptionsMenu;
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO Auto-generated method stub
    // inflating your menu here
    mOptionsMenu = menu;
    return super.onCreateOptionsMenu(menu);
}

Надеюсь, это поможет :)

person Spurdow    schedule 02.09.2014
comment
mOptionsMenu используется именно таким образом. Но после этой строчки я надуваю другой макет. Это проблема? - person Luca; 02.09.2014
comment
Только что попробовал и mOptionsMenu.findItem (R.id.action_filter) .setIcon (R.drawable.ic_action_filter); дает мне исключение nullPointerException. - person Luca; 02.09.2014
comment
хм, опубликуйте здесь свой npe, потому что мой ответ сработал для меня, я тестировал его в своем собственном тестовом примере. - person Spurdow; 03.09.2014
comment
Я разместил все здесь. Надеюсь, это ясно. - person Luca; 03.09.2014

Я надеюсь это поможет тебе

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle(Html.fromHtml("<font color='#ffffff'>" + "Messages" + "</font>"));
    getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.messagebar_color)));
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_arrow_black);
person Trần Thị Diệu My    schedule 20.02.2016

Вам необходимо изменить onCreateOptionsMenu (меню меню)

Я программно изменил цвет панели поиска. Я размещаю здесь код. Надеюсь, это поможет.

    public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.items, menu);
    menu.getItem(0).setIcon(getTintedDrawable(R.drawable.search, R.color.blue));
    return super.onCreateOptionsMenu(menu);
}

Где getTintedDrawable () - это созданная мной функция, которая возвращает объект Drawable. Итак, все, что вам нужно сделать, это заменить getTintedDrawable(R.drawable.search, R.color.blue) на свой drawable.

ПРИМЕЧАНИЕ. Я использовал menu.getItem(0) свой код, так как у меня был только 1 элемент, определенный в menu / items.xml. Если у вас их несколько, попробуйте разные значения (от 0 до на единицу меньше, чем количество пунктов меню). Я предполагаю, что это номер, по которому определен элемент, но я не слишком уверен.

person mysticfyst    schedule 02.09.2016

Мне удалось повернуть / изменить значок следующим образом:

MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST);
<prepare the image view from drawable here>
item.setActionView(imageView);

Вроде работает нормально. Вы также можете просто использовать вместо этого item.setIcon().

person Alen Siljak    schedule 27.08.2016