Динамическое изменение пунктов меню в панели действий Шерлока

Я реализовал панель действий Шерлока в своем приложении для Android. Это приложение имеет функцию корзины покупок. На панели действий есть значок, который переводит пользователя в корзину. Мне нужно динамически изменять этот значок, когда товары добавляются в корзину и удаляются из корзины. То есть число должно появиться над значком корзины на панели действий.

Ниже скриншот:

введите здесь описание изображения

Меню.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/scanner"
        android:icon="@drawable/ic_nav_scanner"
        android:showAsAction="always"
        android:title="@string/scanner"/>
    <item
        android:id="@+id/cart"
        android:icon="@drawable/ic_nav_cart"
        android:showAsAction="always"
        android:title="@string/cart"/>
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_nav_more"
        android:showAsAction="always"
        android:title="@string/more">
        <menu>
             <item
                android:id="@+id/location"
                android:icon="@drawable/ic_nav_dropdown_location"
                android:showAsAction="always"
                android:title="@string/location_action"/>

            <item
                android:id="@+id/fav"
                android:icon="@drawable/ic_nav_dropdown_favourite"
                android:showAsAction="always"
                android:title="@string/favourites"/>
            <item
                android:id="@+id/info"
                android:icon="@drawable/ic_nav_dropdown_information"
                android:title="@string/information"/>
        </menu>
    </item>

</menu>

Код:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.aiwmain, menu);
        return super.onCreateOptionsMenu(menu);
    }

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        super.onOptionsItemSelected(item);

        switch (item.getItemId()) {
        case R.id.scanner:

            //scanner clicked
            break;
}

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

//РЕДАКТИРОВАТЬ

Мне удалось придумать этот бит:

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        DBManager db = DBManager.getSingletonInstance();
        int cartItemCount = db.getCartItemCount(this);
        MenuItem cart = menu.findItem(R.id.cart);
        MenuItem scanner = menu.findItem(R.id.scanner);

        if(cartItemCount > 0){
                    //I want this item to be changed, I do not want to have seperate      drawables for all numbers.
            cart.setIcon(R.drawable.arrow_left);
        }

        return super.onPrepareOptionsMenu(menu);
    }

person TharakaNirmana    schedule 21.11.2013    source источник
comment
вы должны добавить свой новый пункт меню, переопределив onpreparemenuoptions()   -  person Nitin Misra    schedule 21.11.2013
comment
У вас есть пример кода для этого?   -  person TharakaNirmana    schedule 21.11.2013


Ответы (3)


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

значок.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="48dp"
    android:layout_height="fill_parent"
    android:clickable="true"
    style="@android:style/Widget.ActionButton" >

    <!-- Menu Item Image -->
    <ImageView
        android:id="@+id/img_view"
        android:layout_width="48dp"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:background="@drawable/ic_nav_cart" />

    <!-- Badge Count -->

    <TextView
        android:id="@+id/actionbar_notifcation_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="99"
        android:textColor="#9F2828"
        android:textSize="14sp"
        android:layout_toRightOf="@+id/img_view"
        android:background="@drawable/cart_circle"/>

</RelativeLayout>

В моем menu.xml я включаю его следующим образом:

<item
        android:id="@+id/cart"
        android:actionLayout="@layout/badge"
        android:icon="@drawable/ic_nav_cart"
        android:showAsAction="always"
        android:title="@string/cart"/>

Затем в своей деятельности я использую это так:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.aiwmain, menu);

        //getting the count of cart items
        DBManager db = DBManager.getSingletonInstance();
        int cartItemCount = db.getCartItemCount(this);

        badgeLayout = (RelativeLayout) menu.findItem(R.id.cart).getActionView();
        menu.getItem(1).getActionView().setOnClickListener(this);
        TextView tv = (TextView) badgeLayout.findViewById(R.id.actionbar_notifcation_textview);
        tv.setText(""+cartItemCount);
        //do not show the count if count is 0
        if(cartItemCount == 0){
            tv.setVisibility(View.GONE);
        }
        return super.onCreateOptionsMenu(menu);
    }

Вышеупомянутый метод находится в BaseActivity, от которого наследуются все остальные действия. Поэтому вам не нужно включать это во все виды деятельности.

Чтобы обработать onClick ЗНАЧКА КОРЗИНЫ, сделайте это во всех действиях:

public void onClick(View v) {
    // navigating to the cart details by checking the ids of menu item and
    // clicked layout.
    if (v.getId() == R.id.cart) {
        Intent order = new Intent(getApplicationContext(), CartDetailsActivity.class);
        startActivity(order);
    }
}

Ссылка: Как получить текст на значке ActionBar?

person TharakaNirmana    schedule 12.12.2013

Для этого я использую эту (ViewBadger) библиотеку.

person WOLVERINE    schedule 21.11.2013
comment
Похоже, это не помогает моему требованию: github.com/jgilfelt/android-viewbadger/issues /2 не поддерживает в панели действий sherlock.. - person TharakaNirmana; 11.12.2013
comment
круто, но я им пользуюсь :) - person WOLVERINE; 11.12.2013
comment
с пунктом меню «Шерлок» на панели действий? - person TharakaNirmana; 11.12.2013

person    schedule
comment
Я хочу, чтобы этот элемент был изменен, я не хочу иметь отдельные чертежи для всех чисел. пожалуйста, проверьте отредактированный вопрос. - person TharakaNirmana; 11.12.2013