其他分享
首页 > 其他分享> > android – 动态更改操作栏sherlock中的菜单项

android – 动态更改操作栏sherlock中的菜单项

作者:互联网

我在我的android应用程序中实现了操作栏sherlock.此应用程序具有购物车功能.操作栏上有一个图标,可将用户带到购物车.当物品被添加到购物车并从购物车中移除时,我需要动态更改该图标.这是一个数字应该出现在操作栏中的购物车图标的顶部.

以下是截图:

menu.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);
    }

解决方法:

我想出了解决我问题的答案,我为CART菜单项设计了一个自定义布局:

badge.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中,所有其他活动都从该BaseActivity继承.因此,您无需在所有活动中包含此内容.

要处理CART ICON的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);
    }
}

参考:How to get text on an ActionBar Icon?

标签:shopping-cart,android,android-actionbar,menu,actionbarsherlock
来源: https://codeday.me/bug/20190728/1564755.html