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:
- ¿Cuándo y con qué frecuencia se llama al método onPrepareOptionsMenu () para ActionBar?
- OnOptionsItemSelected devuelve ID incorrecto
- Cajón deslizante aparecen en todas las actividades
- Creación de un menú de opciones en Android
- Menú deslizante vertical animado en android
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); }
- Android - Cómo cambiar dinámicamente el texto del elemento de menú fuera de onOptionsItemsSelected o onCreateOptionsMenu
- Cómo agregar un menú inferior a la actividad de Android
- Problema XML en el ejemplo del menú básico
- El botón del menú Android no se muestra
- Cómo crear resideMenu en Android?
- Los iconos de menú de Android no se muestran cuando el nivel de API está por encima de 10
- Android: Detectar mediante programación si el dispositivo tiene botón de menú de hardware
- Desactivar grupo de menús de Android
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.
- abrir el archivo en el clic de la notificación?
- Android: ¿Cómo convertir mi aplicación normal de Android en Android and Launcher?