Изменить фон меню параметров динамически - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть пункт «Корзина» в пункте меню, и я хотел бы отобразить количество товаров в корзине, как показано ниже.

enter image description here

Для этого я хочу создать несколько изображений с номерами от 1 до 9 и 9+ и установить правильное изображение в качестве фона соответствующего пункта меню при открытии меню.

Как я могу это сделать, т.е. как я могу динамически изменить фон элемента меню?

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Переопределить onPrepareOptionsMenu() метод меню. Он вызывается каждый раз, когда пользователь нажимает кнопку Menu.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // Let's find id of resource for drawable with required count
    // assuming you have cartIcon1.png, cartIcon2.png etc
    // in your `drawable` folder
    int resId = getResources().getIdentifier("cartIcon" + numberOfElementsInCart, "drawable", getPackageName()); 

    if (resId != 0)
        menu.findItem(R.id.cart).setIcon(resId);
    // If resource was not found, set default icon
    else 
        menu.findItem(R.id.cart).setIcon(R.drawable.defaultCart);

    return true;
}

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

0 голосов
/ 17 ноября 2011

Ниже приведен ужасный, ужасный взлом, чтобы изменить фоновое изображение меню - обратите внимание, что это изменит все фоны пунктов меню. Возможно, сейчас есть более простой способ сделать это, но это был единственный способ, который я нашел год или около того назад.

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

// Hack to make the menu item selector blue
    protected void setMenuBackground(final int id)
    {
        if(getLayoutInflater().getFactory() != null)
            return;
        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 li = getLayoutInflater();
                        final View view = li.createView(name, null, attrs);
                        //What?
                        //Well the Android system is going to set the background after this is method is done
                        //so we run it later to override the override. Simples?
                        new Handler().post(new Runnable()
                        {
                            public void run()
                            {
                                view.setBackgroundResource(id);
                            }
                        });
                        return view;
                    }
                    catch(InflateException e)
                    {
                    }
                    catch(ClassNotFoundException e)
                    {

                    }
                }
                return null;
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...