Cambio de elementos de menú en barra de acción sherlock dinámicamente

He implementado barra de acción sherlock en mi aplicación de Android. Esta aplicación tiene una funcionalidad de Carrito de Compras. Hay un icono en la barra de acción que lleva al usuario al carro. Necesito cambiar dinámicamente ese icono cuando los artículos se agregan al carro y se quitan del carro. Es decir, un número debe aparecer en la parte superior del icono del carrito en la barra de acción.

A continuación se muestra una captura de pantalla:

introduzca la descripción de la imagen aquí

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> 

Código:

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

Cualquier ayuda para cambiar el icono del carro en la barra de acción dinámicamente es apreciada.

//EDITAR

Me las arreglé para llegar a este poco:

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

Me llegó con la respuesta que se refiere a mi pregunta, he diseñado un diseño personalizado para el artículo de menú 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> 

En mi menu.xml lo incluyo de esta manera:

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

Entonces en mi actividad lo uso así:

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

El método anterior se encuentra en la BaseActivity de la que heredan todas las demás Actividades. Por lo tanto, no es necesario incluir esto en todas las actividades.

Para manejar el onClick de la CART ICON, haz esto en todas las actividades:

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

Referencia: ¿Cómo obtener texto en un icono de ActionBar?

 @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); MenuItem item = menu.findItem(R.id.youitemid1); item.setVisible(false); MenuItem item2 = menu.findItem(R.id.youitemid2); item2.setVisible(true); } 

Yo uso esta biblioteca (ViewBadger) para esto.

  • Android: Crear un menú de acción rápida
  • SearchView en AppCompat distorsiona el icono
  • Android: Obtener una vista Referencia a un elemento de menú
  • Menú PROBLEMAS con algunos dispositivos Android 4.x
  • ¿Cómo seleccionar múltiples casillas de verificación en el submenú de Android?
  • Inflar ActionBarSherlock Menú definido en XML
  • Ampliar la actividad del cajón de navegación a otras actividades
  • ¿Deshabilitar el botón de menú?
  • Creando el menú de opciones android fondo de la página en android
  • Elementos del submenú de la barra de acciones Android mostrados en la parte superior de la barra de acción en lugar de debajo de la barra
  • Alinee un elemento a la izquierda de ActionBar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.