Giới thiệu
Bài này trùng lặp với bài 1003061564 (cùng code custom Toolbar badge). Xem chi tiết tại bài đó.
Tóm tắt khác biệt: Toolbar Badge vs System App Icon Badge
| Đặc điểm | Custom Toolbar Badge (Bài này) | System App Icon Badge |
|---|---|---|
| Vị trí | Trong Toolbar/ActionBar của app | |
| Kiểm soát | Hoàn toàn do app quyết định (số, màu, hình) | Do Launcher quản lý, chỉ bật/tắt |
| API hỗ trợ | Mọi Android version | Android 8.0+ (API 26) |
| Hiển thị khi | Chỉ khi app đang mở | Luôn hiển thị trên launcher |
| Số lượng | Tùy ý (0-999+) | Chỉ chấm đỏ (có/không) |
Code mẫu rút gọn (chỉ phần logic badge)
Helper class quản lý Badge
public class ToolbarBadgeHelper {
private final TextView badgeTextView;
private int count = 0;
public ToolbarBadgeHelper(TextView badgeTextView) {
this.badgeTextView = badgeTextView;
}
public void increment() {
count++;
update();
}
public void decrement() {
count = Math.max(0, count - 1);
update();
}
public void setCount(int count) {
this.count = Math.max(0, count);
update();
}
public void clear() {
count = 0;
update();
}
private void update() {
if (count > 0) {
badgeTextView.setText(count > 99 ? "99+" : String.valueOf(count));
badgeTextView.setVisibility(View.VISIBLE);
} else {
badgeTextView.setVisibility(View.GONE);
}
}
public int getCount() { return count; }
}
Sử dụng trong Activity
private ToolbarBadgeHelper badgeHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
badgeHelper = new ToolbarBadgeHelper(findViewById(R.id.tvBadgeNumber));
// Khi tạo notification
badgeHelper.increment();
// Khi user đọc/xóa (ví dụ trong onResume)
badgeHelper.clear(); // Hoặc setCount(unreadCount)
}
Thư viện hỗ trợ (Deprecated)
ShortcutBadger / BadgeLibrary: Các thư viện cũ dùng reflection/hack để set badge trên launcher icon cho các OEM (Samsung, Xiaomi, OPPO...). Không còn hoạt động tin cậy trên Android 8.0+ do giới hạn bảo mật. Không khuyên dùng cho dự án mới.
Best Practice hiện đại
- Trong app: Custom Toolbar Badge như hướng dẫn.
- Trên Launcher: Dựa vào Notification Channel
setShowBadge(true)(mặc định). Đảm bảo Channel quan trọng (IMPORTANCE_HIGH/DEFAULT) để badge hiện. - Đồng bộ: Dùng WorkManager/Service để cập nhật unread count từ server, lưu local, cập nhật cả 2 nơi.