El icono de cuenta de notificación de barra de acciones (insignia) como Google tiene

¿Hay una insignia estándar de Android o un método para mostrar el icono de notificación de la barra de acciones con un conteo como en los ejemplos de Google?

cuenta 3 en la imagen

Si no, ¿cuál es la mejor manera de hacerlo?
Soy nuevo en Android, por favor ayuda.

No estoy seguro de si esta es la mejor solución o no, pero es lo que necesito.

Por favor dígame si sabe lo que se necesita cambiar para un mejor rendimiento o calidad. En mi caso, tengo un botón.

Artículo personalizado en mi menú – main.xml

  

Forma personalizada dibujable (cuadrado de fondo) – shape_notification.xml

       

Diseño para mi vista – feed_update_count.xml

   

MainActivity: configuración y actualización de mi vista

 static Button notifCount; static int mNotifCount = 0; @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); View count = menu.findItem(R.id.badge).getActionView(); notifCount = (Button) count.findViewById(R.id.notif_count); notifCount.setText(String.valueOf(mNotifCount)); return super.onCreateOptionsMenu(menu); } private void setNotifCount(int count){ mNotifCount = count; invalidateOptionsMenu(); } 

Solo compartiré mi código en caso de que alguien quiera algo como esto: enter image description here

  • diseño / menú / menu_actionbar.xml

       ...  ...  
  • layout / action_bar_notifitcation_icon.xml

    Estilo de nota y android: propiedades clicables . estos hacen que el diseño tenga el tamaño de un botón y que el fondo sea gris al tocarlo.

          
  • drawable-xhdpi / ic_bell.png

    Una imagen de 64×64 píxeles con almohadillas de 10 píxeles de ancho desde todos los lados. Se supone que tienes almohadillas de 8 píxeles de ancho, pero la mayoría de los elementos predeterminados son ligeramente más pequeños que eso. Por supuesto, querrás usar diferentes tamaños para diferentes densidades.

  • drawable / rounded_square.xml

    Aquí, # ff222222 (color # 222222 con alfa #ff (completamente visible)) es el color de fondo de mi barra de acciones.

           
  • com / ubergeek42 / WeechatAndroid / WeechatActivity.java

    ¡Aquí lo hacemos clicable y actualizable! Creé un oyente abstracto que proporciona la creación de Toast en onLongClick, el código fue tomado de las fonts de ActionBarSherlock .

     private int hot_number = 0; private TextView ui_hot = null; @Override public boolean onCreateOptionsMenu(final Menu menu) { MenuInflater menuInflater = getSupportMenuInflater(); menuInflater.inflate(R.menu.menu_actionbar, menu); final View menu_hotlist = menu.findItem(R.id.menu_hotlist).getActionView(); ui_hot = (TextView) menu_hotlist.findViewById(R.id.hotlist_hot); updateHotCount(hot_number); new MyMenuItemStuffListener(menu_hotlist, "Show hot message") { @Override public void onClick(View v) { onHotlistSelected(); } }; return super.onCreateOptionsMenu(menu); } // call the updating code on the main thread, // so we can call this asynchronously public void updateHotCount(final int new_hot_number) { hot_number = new_hot_number; if (ui_hot == null) return; runOnUiThread(new Runnable() { @Override public void run() { if (new_hot_number == 0) ui_hot.setVisibility(View.INVISIBLE); else { ui_hot.setVisibility(View.VISIBLE); ui_hot.setText(Integer.toString(new_hot_number)); } } }); } static abstract class MyMenuItemStuffListener implements View.OnClickListener, View.OnLongClickListener { private String hint; private View view; MyMenuItemStuffListener(View view, String hint) { this.view = view; this.hint = hint; view.setOnClickListener(this); view.setOnLongClickListener(this); } @Override abstract public void onClick(View v); @Override public boolean onLongClick(View v) { final int[] screenPos = new int[2]; final Rect displayFrame = new Rect(); view.getLocationOnScreen(screenPos); view.getWindowVisibleDisplayFrame(displayFrame); final Context context = view.getContext(); final int width = view.getWidth(); final int height = view.getHeight(); final int midy = screenPos[1] + height / 2; final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; Toast cheatSheet = Toast.makeText(context, hint, Toast.LENGTH_SHORT); if (midy < displayFrame.height()) { cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT, screenWidth - screenPos[0] - width / 2, height); } else { cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height); } cheatSheet.show(); return true; } } 

Solo para agregar. Si alguien quiere implementar una burbuja de círculo llena, aquí está el código ( bage_circle.xml nombre bage_circle.xml ):

      

Es posible que deba ajustar el grosor de acuerdo con su necesidad.

enter image description here

EDITAR: Aquí está el diseño del botón ( badge_layout.xml nombre badge_layout.xml ):

     

En el menú crear elemento:

  

En onCreateOptionsMenu obtener referencia al elemento de menú:

  itemMessages = menu.findItem(R.id.menu_messages); badgeLayout = (RelativeLayout) itemMessages.getActionView(); itemMessagesBadgeTextView = (TextView) badgeLayout.findViewById(R.id.badge_textView); itemMessagesBadgeTextView.setVisibility(View.GONE); // initially hidden iconButtonMessages = (IconButton) badgeLayout.findViewById(R.id.badge_icon_button); iconButtonMessages.setText("{fa-envelope}"); iconButtonMessages.setTextColor(getResources().getColor(R.color.action_bar_icon_color_disabled)); iconButtonMessages.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (HJSession.getSession().getSessionId() != null) { Intent intent = new Intent(getThis(), HJActivityMessagesContexts.class); startActivityForResult(intent, HJRequestCodes.kHJRequestCodeActivityMessages.ordinal()); } else { showLoginActivity(); } } }); 

Después de recibir la notificación de los mensajes, configure el conteo:

 itemMessagesBadgeTextView.setText("" + count); itemMessagesBadgeTextView.setVisibility(View.VISIBLE); iconButtonMessages.setTextColor(getResources().getColor(R.color.white)); 

Este código usa Iconify-fontawesome .

 compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.1.+' 

No me gustan las ActionView basadas en ActionView , mi idea es:

  1. crear un diseño con TextView , que TextView se completará con la aplicación
  2. cuando necesitas dibujar un elemento de MenuItem :

    2.1. inflar el diseño

    2.2. call measure() y layout() (de lo contrario, view será 0px x 0px, es demasiado pequeño para la mayoría de los casos de uso)

    2.3. establecer el texto de TextView

    2.4. hacer “captura de pantalla” de la vista

    2.6. establece el ícono de MenuItem basado en el bitmap creado en 2.4

  3. ¡lucro!

Entonces, el resultado debería ser algo así como enter image description here

  1. crear diseño aquí es un ejemplo simple
        

@drawable/unread_background es que el TextView verde de TextView , @drawable/ic_menu_gallery no es realmente necesario aquí, es solo una vista previa del resultado del diseño en IDE.

  1. agregar código en onCreateOptionsMenu / onPrepareOptionsMenu

     @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem menuItem = menu.findItem(R.id.testAction); menuItem.setIcon(buildCounterDrawable(count, R.drawable.ic_menu_gallery)); return true; } 
  2. Implementar el método build-the-icon:

     private Drawable buildCounterDrawable(int count, int backgroundImageId) { LayoutInflater inflater = LayoutInflater.from(this); View view = inflater.inflate(R.layout.counter_menuitem_layout, null); view.setBackgroundResource(backgroundImageId); if (count == 0) { View counterTextPanel = view.findViewById(R.id.counterValuePanel); counterTextPanel.setVisibility(View.GONE); } else { TextView textView = (TextView) view.findViewById(R.id.count); textView.setText("" + count); } view.measure( View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.setDrawingCacheEnabled(true); view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(false); return new BitmapDrawable(getResources(), bitmap); } 

El código completo está aquí: https://github.com/cvoronin/ActionBarMenuItemCounter

Ok, para que la solución @AndrewS funcione con la biblioteca v7 appCompat :

    

.

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.clear(); inflater.inflate(R.menu.main, menu); MenuItem item = menu.findItem(R.id.saved_badge); MenuItemCompat.setActionView(item, R.layout.feed_update_count); View view = MenuItemCompat.getActionView(item); notifCount = (Button)view.findViewById(R.id.notif_count); notifCount.setText(String.valueOf(mNotifCount)); } private void setNotifCount(int count){ mNotifCount = count; supportInvalidateOptionsMenu(); } 

El rest del código es el mismo.

Intente ver las respuestas a estas preguntas, particularmente la segunda que tiene código de muestra:

Cómo implementar valores dynamics en el elemento del menú en Android

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

Por lo que veo, necesitarás crear tu propia implementación personalizada de ActionView . Una alternativa podría ser un Drawable personalizado. Tenga en cuenta que no parece haber una implementación nativa de un recuento de notificaciones para la barra de acciones.

EDITAR: la respuesta que estaba buscando, con código: vista de notificación personalizada con implementación de muestra

Cuando usas la barra de herramientas:

 .... private void InitToolbar() { toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); toolbartitle = (TextView) findViewById(R.id.titletool); toolbar.inflateMenu(R.menu.show_post); toolbar.setOnMenuItemClickListener(this); Menu menu = toolbar.getMenu(); MenuItem menu_comments = menu.findItem(R.id.action_comments); MenuItemCompat .setActionView(menu_comments, R.layout.menu_commentscount); View v = MenuItemCompat.getActionView(menu_comments); v.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // Your Action } }); comment_count = (TextView) v.findViewById(R.id.count); } 

y en su datos de carga, llame a refreshMenu ():

 private void refreshMenu() { comment_count.setVisibility(View.VISIBLE); comment_count.setText("" + post_data.getComment_count()); } 

En lugar de administrar formas personalizadas y dibujables, ¿por qué no usar el mecanismo Android incorporado? Puede usar el estilo de insignia en TextView y usar un estilo personalizado según su tema.

Aclamaciones. 🙂

   

Resultado