Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách tạo icon Action Bar có số lượng thông báo (Badge) Android

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

Trên icon app ở Launcher/Home screen
Đặc điểmCustom Toolbar Badge (Bài này)System App Icon Badge
Vị tríTrong Toolbar/ActionBar của app
Kiểm soátHoà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 versionAndroid 8.0+ (API 26)
Hiển thị khiChỉ khi app đang mởLuôn hiển thị trên launcher
Số lượngTù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

  1. Trong app: Custom Toolbar Badge như hướng dẫn.
  2. 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.
  3. Đồ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.