Значок подсчета уведомлений панели действий (значок), например, Google

Есть ли стандартный значок или метод Android для отображения значка уведомления панели действий с подсчетом, например, на примерах Google?

счет 3 на картинке

Если нет, то каков наилучший способ сделать это?
Я новичок в андроиде, пожалуйста, помогите.

Я не уверен, что это лучшее решение или нет, но это то, что мне нужно.

Скажите, пожалуйста, если вы знаете, что нужно менять для лучшей производительности или качества. В моем случае у меня есть кнопка.

Пользовательский элемент в моем меню – main.xml

  

Пользовательская форма для рисования (фоновый квадрат) – shape_notification.xml

       

Макет для моего представления – feed_update_count.xml

   

MainActivity – настройка и обновление моего представления

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

Я просто передам свой код, если кто-то захочет что-то вроде этого: введите описание изображения здесь

  • Макет / меню / menu_actionbar.xml

       ...  ...  
  • макет / action_bar_notifitcation_icon.xml

    Стиль примечаний и андроид: интерактивные свойства. они делают макет размером кнопки и делают серый цвет при касании.

          1      
  • вытяжка-xhdpi / ic_bell.png

    Изображение размером 64×64 пикселей с шириной 10 пикселей со всех сторон. Предполагается, что у вас есть прошивки шириной 8 пикселей, но я считаю, что большинство элементов по умолчанию немного меньше этого. Конечно, вы захотите использовать разные размеры для разных плотностей.

  • рисуем / rounded_square.xml

    Здесь # ff222222 (цвет # 222222 с альфой #ff (полностью видимый)) является цветом фона моей панели действий.

           
  • ком / ubergeek42 / WeechatAndroid / WeechatActivity.java

    Здесь мы делаем его интерактивным и обновляемым! Я создал абстрактного слушателя, который обеспечивает создание Toast на onLongClick, код был взят из источников 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; } } 

Просто чтобы добавить. Если кто-то хочет реализовать заполненный пузырь круга, вот код (назовите его bage_circle.xml ):

      

Возможно, вам придется отрегулировать толщину в соответствии с вашими потребностями.

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

EDIT: Вот макет кнопки (назовите ее badge_layout.xml ):

     

В меню create item:

  

В onCreateOptionsMenu получите ссылку на пункт меню:

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

После получения уведомления для сообщений установите счетчик:

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

Этот код использует Iconify-fontawesome .

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

Мне не нравятся ActionView основе ActionView , моя идея:

  1. создать макет с TextView , чтобы TextView был заполнен приложением
  2. когда вам нужно нарисовать MenuItem :

    2.1. раздувать макет

    2.2. call measure() и layout() (иначе view будет 0px x 0px, он слишком мал для большинства случаев использования)

    2,3. установить текст TextView

    2,4. сделать «снимок экрана» вида

    2.6. установить значок MenuItem на основе растрового изображения, созданного на 2.4

  3. прибыль!

поэтому результат должен быть чем-то вроде введите описание изображения здесь

  1. создать макет здесь – простой пример
        

@drawable/unread_background – то, что зеленый фон TextView , @drawable/ic_menu_gallery здесь не требуется, это просто, чтобы просмотреть результат макета в среде IDE.

  1. добавить код в 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. Реализовать метод 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); } 

Полный код находится здесь: https://github.com/cvoronin/ActionBarMenuItemCounter

Хорошо, для решения @AndrewS для работы с библиотекой 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(); } 

Остальная часть кода такая же.

Попытайтесь найти ответы на эти вопросы, особенно второй, который содержит пример кода:

Как реализовать динамические значения в пункте меню на Android

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

Из того, что я вижу, вам нужно создать свою собственную реализацию ActionView . Альтернативой может быть пользовательский Drawable . Обратите внимание, что, по-видимому, не существует встроенной версии подсчета уведомлений для панели действий.

EDIT: ответ, который вы искали, с кодом: пользовательский вид уведомления с примерной реализацией

Когда вы используете панель инструментов:

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

и в вашем загрузочном сообщении refreshMenu ():

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

Вместо управления пользовательской формой и возможностью рисования, почему бы не использовать встроенный механизм Android? Вы можете использовать стиль значка в TextView и использовать пользовательский стиль в соответствии с вашей темой.

Приветствия. 🙂

   

результат

  • Android - менеджер уведомлений, имеющий уведомление без намерения
  • Запись данных регистратора android в файл
  • Interesting Posts

    Добавление файлов Jar в путь classа IntellijIdea

    Spring, Jackson и Customization (например, CustomDeserializer)

    Редактор VBA автоматически удаляет пробелы на концах строк

    Привязка видимости кнопки к значению bool в ViewModel

    В чем разница между источником данных и делегатом?

    Как я могу предотвратить «Читать дальше: www.site.com» от того, что вы вводили не-Tynt JavaScript в действия копирования-вставки?

    Процесс не может получить доступ к файлу, поскольку он используется другим процессом

    В XVI32, почему 'File access denied' все еще после выбора 'Run as Administrator'?

    Создание циклически связанного списка в C #?

    Как получить приложение Dash Doc для уважения отступов?

    Подход DDD для доступа к внешней информации

    Fit Image в ImageButton в Android

    Использование транзакций или SaveChanges (false) и AcceptAllChanges ()?

    В Windows Explorer почему мы можем создать папку или файл с символом процента (%), если символ процента используется для существующих переменных?

    Ошибки компоновщика при компиляции против glib …?

    Давайте будем гением компьютера.