Значок подсчета уведомлений панели действий (значок), например, Google
Есть ли стандартный значок или метод Android для отображения значка уведомления панели действий с подсчетом, например, на примерах Google?
Если нет, то каков наилучший способ сделать это?
Я новичок в андроиде, пожалуйста, помогите.
- Как отправить параметры из уведомления об уведомлении на мероприятие?
- Читать файл As String
- Уведомление об обнаружении службы доступности Android
- Как добавить значок значка / счетчик приложений на устройства Sony Xperia?
- Невозможно импортировать javax.imageio.ImageIO в приложение для Android
- Android - установить максимальную длину сообщений logcat
- Как включить / отключить уровни журналов в Android?
- Pixel-Perfect Collision Detection Android
- Как перенаправить вывод моего журнала с logcat на SD-карту на устройство Android?
- Почему я не должен использовать System.out.println () в android
- сравнить два изображения в android
- E / Поверхность: getSlotFromBufferLocked: неизвестный буфер: 0xab7519c0
- Вход в файл на Android
Я не уверен, что это лучшее решение или нет, но это то, что мне нужно.
Скажите, пожалуйста, если вы знаете, что нужно менять для лучшей производительности или качества. В моем случае у меня есть кнопка.
Пользовательский элемент в моем меню – 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
Стиль примечаний и андроид: интерактивные свойства. они делают макет размером кнопки и делают серый цвет при касании.
-
вытяжка-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
, моя идея:
- создать макет с
TextView
, чтобыTextView
был заполнен приложением -
когда вам нужно нарисовать
MenuItem
:2.1. раздувать макет
2.2. call
measure()
иlayout()
(иначеview
будет 0px x 0px, он слишком мал для большинства случаев использования)2,3. установить текст
TextView
2,4. сделать «снимок экрана» вида
2.6. установить значок
MenuItem
на основе растрового изображения, созданного на 2.4 -
прибыль!
поэтому результат должен быть чем-то вроде
- создать макет здесь – простой пример
@drawable/unread_background
– то, что зеленый фон TextView
, @drawable/ic_menu_gallery
здесь не требуется, это просто, чтобы просмотреть результат макета в среде IDE.
-
добавить код в
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; }
-
Реализовать метод 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
и использовать пользовательский стиль в соответствии с вашей темой.
Приветствия. 🙂