Hiển thị huy hiệu trên đầu biểu tượng của thanh điều hướng dưới cùng


82

Tôi đã triển khai chế độ xem điều hướng dưới cùng trong ứng dụng của mình và tôi đã xem xét mọi nơi để hiển thị các huy hiệu trên đầu các biểu tượng như thế này, tôi đã tự hỏi liệu điều này có thể thực hiện được hay không. Bất kỳ trợ giúp được đánh giá cao. Cảm ơn bạn.


1
Điều chắc chắn là có thể. Bạn có thể tự tạo huy hiệu trong xml bố cục cho chế độ xem điều hướng phía dưới của mình. Thu thập bố cục khung và đặt biểu tượng menu của bạn bên dưới huy hiệu và tạo logic để hiển thị / ẩn chế độ xem huy hiệu của bạn.
velval

1
Bạn có thể sử dụng BadgeView ; Hoặc tìm kiếm trong github.
zxbin

@velval Bạn có ví dụ về mã hoặc hướng dẫn cách thực hiện điều này không?
kalamar


thisliên kết trong OP là 404
John

Câu trả lời:


42

Chỉnh sửa năm 2020:

BottomNavigationThay vào đó, sử dụng từ các thành phần vật chất, nó hỗ trợ thêm huy hiệu trên các mặt hàng và nhiều tính năng khác ngoài hộp:

https://github.com/material-components/material-components-android/blob/master/docs/components/BottomNavigation.md

Câu trả lời cũ:

Khi sử dụng thư viện hỗ trợ thanh Điều hướng dưới cùng, việc hiển thị huy hiệu / thông báo trên các mục menu khá phức tạp. Tuy nhiên, có những giải pháp dễ dàng để thực hiện nó. Chẳng hạn như https://github.com/aurelhubert/ahbottomnavigation

Thư viện này là phiên bản nâng cao hơn của thanh Điều hướng dưới cùng. Và bạn có thể đặt huy hiệu trên mục menu chỉ cần sử dụng đoạn mã này.

bottomNavigation.setNotification(notification, bottomNavigation.getItemsCount() - 1);

Và bạn sẽ nhận được kết quả sau

nhập mô tả hình ảnh ở đây


hoạt động tốt và thư viện này là tốt hơn so với BottomNav mẹ đẻ
Syed Usama Ahmad

1
Đối với năm 2020, vui lòng xem câu trả lời của @ Abel dưới đây cho thấy một cách để thực hiện bằng cách sử dụng chế độ xem kho từ thư viện tài liệu của google. Để biết thêm thông tin: material.io/develop/android/components/bottom-navigation-view
HBB20

157

Nếu bạn chỉ muốn sử dụng cổ phiếu BottomNavigationViewvà không có lib của bên thứ ba thì đây là cách tôi đã thực hiện:

BottomNavigationMenuView bottomNavigationMenuView =
            (BottomNavigationMenuView) navigationView.getChildAt(0);
View v = bottomNavigationMenuView.getChildAt(3); 
BottomNavigationItemView itemView = (BottomNavigationItemView) v;

View badge = LayoutInflater.from(this)
            .inflate(R.layout.notification_badge, itemView, true);

Sau đó, đây là tệp bố cục:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <TextView
        android:id="@+id/notifications.badge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|center_horizontal"
        android:layout_marginLeft="10dp"
        android:layout_marginStart="10dp"
        android:background="@drawable/notification_badge"
        android:gravity="center"
        android:padding="3dp"
        android:text="9+"
        android:textColor="@color/white"
        android:textSize="11sp" />
</merge>

Sau đó, chỉ cần tìm TextViewtheo id và đặt văn bản. @drawable/notification_badgechỉ là một hình tròn có thể vẽ được


Nó không phải là cần thiết để quấn mình TextViewtrong một FrameLayouttừ BottomNavigationItemViewmở rộngFrameLayout
Victor Rendina

nó hoạt động giống như một sự quyến rũ, nhưng tôi đang cố gắng gỡ bỏ nó, làm cách nào tôi có thể làm được?
ismail alaoui

13
Chỉ cần sử dụng phương pháp này để xóa huy hiệu. public void removeBadge(BottomNavigationView navigationView, int index) { BottomNavigationMenuView bottomNavigationMenuView = (BottomNavigationMenuView) navigationView.getChildAt(0); View v = bottomNavigationMenuView.getChildAt(index); BottomNavigationItemView itemView = (BottomNavigationItemView) v; itemView.removeViewAt(itemView.getChildCount()-1); }
Nilesh Rathore

3
Tôi nghĩ rằng tôi đã tìm thấy một cách gọn gàng hơn một chút để xóa huy hiệu khỏi câu trả lời @NileshRathore. Thay vì itemView.removeViewAt(itemView.getChildCount()-1);tôi thay vì sử dụng:View badge = itemView.findViewById(R.id.notifications_badge); ((ViewGroup)badge.getParent()).removeView(badge);
JamTheMan

9
Tôi đã có một ngoại lệ thời gian chạy: android.view.InflateException: Binary dòng tập tin XML # 1: <merge /> có thể được sử dụng chỉ với một gốc hợp lệ ViewGroup và attachToRoot = true
Blažej SLEBODA

69

Hiện tại, việc thêm huy hiệu được hỗ trợ nguyên bản, bằng cách sử dụng phụ thuộc material mới nhất, hãy thêm điều này vào build.gradle của bạn

    implementation 'com.google.android.material:material:1.1.0-alpha09'

trong bố cục của bạn thêm cái này

<!-- The rest of your layout here ....-->

  <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:menu="@menu/bottom_nav_menu"
            />

sau đó bạn có thể chỉ

     val navBar  = findViewById<BottomNavigationView>(R.id.bottom_navigation)
     navBar.getOrCreateBadge(R.id.action_add).number = 2

R.id.action_add đối với bạn sẽ là id của mục menu mà bạn muốn gắn huy hiệu. Kiểm tra nó từ tệp menu bạn cấp cho BottomNavigationView.

Đảm bảo chủ đề ứng dụng của bạn có trong Theme.MaterialComponents

bạn có thể kiểm tra nó trong các kiểu hoặc tệp kê khai. ví dụ này của tôi là cái này

     <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">@color/colorPrimary</item>
    </style>

4
IMHO câu trả lời nên được cập nhật cho điều này. Tôi vừa triển khai điều này trong ứng dụng của mình và hoạt động như một sự quyến rũ.
Oliver Mahoney

5
Nếu chủ đề ứng dụng của bạn chưa kế thừa từ Theme.MaterialComponents, giống như tôi (Theme.AppCompat), hãy chuẩn bị cho một số cấu trúc lại phần còn lại của ứng dụng của bạn. Tôi nên tìm ra điều này một chút đầu tiên. BTW, thay đổi chủ đề là bắt buộc nếu không huy hiệu sẽ bị hỏng. stackoverflow.com/questions/53476115/…
ChrisPrime

4
Mở rộng trên nhận xét trước đây của tôi, để giữ nguyên kiểu dáng của bạn khi chuyển từ một Theme.AppCompat.*biến thể, chỉ cần sử dụng Theme.MaterialCompoonents.*.Bridgebiến thể tương ứng cho bản dịch trực tiếp mà không cần phải định dạng lại bất kỳ thứ gì. medium.com/over-engineering/…
ChrisPrime

1
Đáng lẽ câu trả lời đã được chấp nhận, hãy sử dụng biến thể chủ đề material này là Theme.MaterialCompoonents. *. Cầu nối để tránh sự cố.
Sadda Hussain

43

CHỈNH SỬA 2:
BottomNavigationView hiện hỗ trợ hiển thị huy hiệu nguyên bản, như đã nói trong tài liệu ở đây .

bottomNavigation.getOrCreateBadge(menuItemId)


Tôi đang gặp phải vấn đề tương tự và tôi không muốn sử dụng thư viện.

Vì vậy, tôi đã tạo một bố cục tùy chỉnh có tên layout_news_badge:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/badge_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:id="@+id/badge_text_view"
        android:layout_width="19dp"
        android:layout_height="19dp"
        android:textSize="11sp"
        android:textColor="@android:color/white"
        android:background="@drawable/news_bottom_nav_bg"
        android:layout_gravity="top"
        android:layout_marginTop="4dp"
        android:layout_marginStart="16dp"
        android:gravity="center"
        android:padding="2dp"
        tools:text="9+" />
</FrameLayout>

Nền TextView ( news_bottom_nav_bg):

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color="?attr/colorPrimary" />
</shape>

Sau đó, tôi đã tạo một BottomMenuHelperbằng 2 phương thức này:

public static void showBadge(Context context, BottomNavigationView 
    bottomNavigationView, @IdRes int itemId, String value) {
    removeBadge(bottomNavigationView, itemId);
    BottomNavigationItemView itemView = bottomNavigationView.findViewById(itemId);
    View badge = LayoutInflater.from(context).inflate(R.layout.layout_news_badge, bottomNavigationView, false);
    
    TextView text = badge.findViewById(R.id.badge_text_view);
    text.setText(value);
    itemView.addView(badge);
}

public static void removeBadge(BottomNavigationView bottomNavigationView, @IdRes int itemId) {
    BottomNavigationItemView itemView = bottomNavigationView.findViewById(itemId);
    if (itemView.getChildCount() == 3) {
        itemView.removeViewAt(2);
    }
}

Sau đó, khi tôi gọi nó trong Hoạt động của mình:

BottomMenuHelper.showBadge(this, mBottomNavigationView, R.id.action_news, "1");

CHỈNH SỬA 1: Đã thêm cải tiến theo đề xuất jatin rana


1
giá trị marginTop và marginStart là gì?
bán từ

Xin lỗi, bạn nói đúng, những giá trị đó không rõ ràng. Tôi đã chỉnh sửa và thay thế chúng bằng các giá trị mà tôi đã sử dụng trong dự án của mình. Cảm ơn bạn :)
ilbose 17/1218

1
gọi removeBadgetrước khi gọi showBadgeđể tránh thêm các lượt xem trùng lặp.
jatin rana

1
nó hoạt động với android.support.design.widget.BottomNavigationView
Roger

1
rực rỡ, hoan hô!
raphaelbgr

15

Cập nhật: huy hiệu hỗ trợ vật chất hiện tại, xem thêm bên dưới

đóng bao nguyên liệu

điều hướng dưới cùng

val badge = bottomNavigation.getOrCreateBadge(menuItemId)
badge.isVisible = true
// An icon only badge will be displayed unless a number is set:
badge.number = 99

Câu trả lời cũ

dựa trên câu trả lời của @ Tinashe, tôi muốn huy hiệu hiển thị dưới dạng bên dưới mà không có số: nhập mô tả hình ảnh ở đây

mã:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
        // position = 2
        addBadge(POSITION_HISTORY)
    }

    /**
     * add badge(notification dot) to bottom bar
     * @param position to get badge container
     */
    @SuppressLint("PrivateResource")
    private fun addBadge(position: Int) {
        // get badge container (parent)
        val bottomMenu = navigation.getChildAt(0) as? BottomNavigationMenuView
        val v = bottomMenu?.getChildAt(position) as? BottomNavigationItemView

        // inflate badge from layout
        badge = LayoutInflater.from(this)
                .inflate(R.layout.badge_layout, bottomMenu, false)

        // create badge layout parameter
        val badgeLayout: FrameLayout.LayoutParams = FrameLayout.LayoutParams(badge?.layoutParams).apply {
            gravity = Gravity.CENTER_HORIZONTAL
            topMargin = resources.getDimension(R.dimen.design_bottom_navigation_margin).toInt()

            // <dimen name="bagde_left_margin">8dp</dimen>
            leftMargin = resources.getDimension(R.dimen.bagde_left_margin).toInt()
        }

        // add view to bottom bar with layout parameter
        v?.addView(badge, badgeLayout)
    }

huy hiệu_layout.xml (huy hiệu_size = 12dp)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/badge_size"       
    android:layout_height="@dimen/badge_size"
    android:background="@drawable/new_notification" />

và nền có thể vẽ new_notification.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <corners android:radius="100dp"/>
    <solid android:color="#F44336"/>
</shape>

1
Làm cách nào để xóa huy hiệu?
Sudhir Khanger

1
@SudhirKhanger để loại bỏ, tạo biến toàn cục cho chế độ xem huy hiệu. và chỉ cần vượt qua như nhau trong v.removeView (ký hiệu) như cùng một cách thức mà nó đã được thêm vào
Narendra Pal

14

Huy hiệu hiện đã được thêm vào như một phần của AndroidX BottomNavigationView bởi BadgeDrawable. Xem tài liệu

fun setBadge(count: Int) {
    if (count == 0) {
        bottomNavigationView.removeBadge(R.id.ticketsNavigation)
    } else {
        val badge = bottomNavigationView.getOrCreateBadge(R.id.ticketsNavigation) // previously showBadge
        badge.number = count
        badge.backgroundColor = getColor(R.color.badge)
        badge.badgeTextColor = getColor(R.color.blackTextColor)
    }
}

// Menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/ticketsNavigation"
        android:icon="@drawable/vector_drawable_navbar_tickets"
        android:title="@string/tickets_title"/>
    ...
</menu>

Biên tập:

Như đã lưu ý trong các nhận xét, có thể chỉ cần cập nhật số lượng huy hiệu mà không cần thêm hoặc xóa huy hiệu mọi lúc như thế này:

fun setBadge(count: Int) {
    bottomNavigationView.getBadge(menuItemId)?.isVisible = count > 0
}

Nó có trong tài liệu, nhưng kể từ tháng 10 năm 2019, nó không phải là một phần của com.google.android.material: material: 1.2.0_beta1 trở về trước.
làm cho lúng túng - Do not be evil SE

@ Flummox-don'tbeevilSE Vâng, chúng tôi đang sử dụng nó trong sản xuất với 1.1.0-alpha07 - vì vậy tôi nghĩ bạn đã nhầm.
Morten Holmgaard

@MortenHomgaard, điều đó thật thú vị, có lẽ sự khác biệt giữa Java và Kotlin? Tôi đang chơi xung quanh với điều này, nhưng không thể làm theo cách bạn đã đăng ở đây.
làm cho lúng túng - Do not be evil SE

showBadgeđã được thay đổi thành getOrCreateBadge.
Morten Holmgaard

1
Chỉ là một FYI cho độc giả tương lai. Nếu bạn chỉ muốn hiển thị / ẩn huy hiệu, bạn có thể truy cập nó bằng bottom_navigation_view.getBadge (menuItemId)?. IsVosystem = NEW_VISIBILITY_STATE Không cần phải liên tục xóa / tạo huy hiệu :).
Joaquim Ley

8

Như câu trả lời @zxbin. bạn có thể kiểm tra BadgeView và thử mã bên dưới

BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(this);
navigation.setSelectedItemId(R.id.navigation_store);
BottomNavigationMenuView bottomNavigationMenuView =
        (BottomNavigationMenuView) navigation.getChildAt(0);
View v = bottomNavigationMenuView.getChildAt(4); // number of menu from left
new QBadgeView(this).bindTarget(v).setBadgeNumber(5);

nguồn từ ý chính của tôi


Hi, làm thế nào để thiết lập lề phải của huy hiệu trong khi nó chỉ hiển thị ở vị trí bên phải của view
famfamfam

Tài liệu hướng dẫn người nghèo nhưng có vẻ lý tưởng thực sự
TheRealChx101

6

Hãy thử điều này một lần.

1) Tạo tệp xml cho huy hiệu (ví dụ: notification_badge_view.xml)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/badge"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_gravity="top|center_horizontal"
        android:layout_marginStart="10dp"
        android:gravity="center"
        android:padding="3dp"
        app:srcCompat="@drawable/notification_badge" />
</FrameLayout>

2) Tạo tệp có thể vẽ cho hình dạng chấm thông báo (ví dụ: huy hiệu_circle.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/colorAccent" />
    <stroke
        android:width="2dp"
        android:color="@android:color/white" />
</shape>

3) Trong hoạt động của bạn, phương pháp onCreate thêm chế độ xem huy hiệu vào BottomNavigationView

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_landing);

         addBadgeView();

    }

4) Và phương thức addBadgeView bên dưới

private void addBadgeView() {
        try {
            BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationBar.getChildAt(0);
            BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(0); //set this to 0, 1, 2, or 3.. accordingly which menu item of the bottom bar you want to show badge
            notificationBadge = LayoutInflater.from(LandingActivity.this).inflate(R.layout.view_notification_badge, menuView, false);
            itemView.addView(notificationBadge);
            notificationBadge.setVisibility(GONE);// initially badge will be invisible 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Lưu ý: bottomNavigationBar là chế độ xem thanh dưới cùng của bạn.

5) Làm mới huy hiệu để hiển thị và ẩn bằng phương pháp sau

private void refreshBadgeView() {
        try {
            boolean badgeIsVisible = notificationBadge.getVisibility() != GONE;
            notificationBadge.setVisibility(badgeIsVisible ? GONE : VISIBLE);//makes badge visible and invisible 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

6) Và thực hiện ẩn khi chúng ta nhấp vào trang thanh dưới cùng cụ thể bằng cách dòng sau.

bottomNavigationBar.setOnNavigationItemSelectedListener(new 
BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) 
              {
                switch (menuItem.getItemId()) {
                    case R.id.bottom_bar_one:
                        //while moving to first fragment
                        notificationBadge.setVisibility(GONE);
                        break;
                    case R.id.bottom_bar_two:
                        //moving to second fragment
                        break;
                    case R.id.bottom_bar_three:
                        //moving to third fragment
                        break;
                }
                return true;
            }
        });

5

Một cách đơn giản:

Khi Material Design cập nhật thư viện của họ và theo

https://medium.com/over-engineering/hands-on-with-material-components-for-android-bottom-navigation-aae2aa9066be

Tôi đã có thể cập nhật (hoặc tạo Huy hiệu BottomNavigationView) từ bên trong bộ điều hợp trình tái chế của mình (trong một phân đoạn) mà không cần bất kỳ lib bên ngoài nào .

Trạng thái ban đầu: Trạng thái ban đầu

Vì vậy, như trong bộ điều hợp, tôi lấy Ngữ cảnh từ hoạt động của mình, tôi truy cập nó và khôi phục phiên bản điều hướng dưới cùng:

navBottomView = ((AppCompatActivity)this.context).findViewById(R.id.nav_view);

kiểm tra xem huy hiệu có rỗng không (chưa được tạo), nếu có, hãy đặt nó thành số lượng được chọn:

  BadgeDrawable badgeDrawable = navBottomView.getBadge(R.id.navigation_carrinho);
  if (badgeDrawable == null)
      navBottomView.getOrCreateBadge(R.id.navigation_carrinho).setNumber(item.getQuantidade());

nếu không, hãy lấy số lượng trước đó và tăng giá trị huy hiệu:

int previousValue = badgeDrawable.getNumber();
badgeDrawable.setNumber(previousValue + item.getQuantidade());

Đừng quên nhập khẩu:

import com.google.android.material.badge.BadgeDrawable;
import com.google.android.material.bottomnavigation.BottomNavigationView;

Trạng thái cuối cùng:

Trạng thái cuối cùng

Tất cả trong một với trình nghe nút thêm vào giỏ hàng:

btnAddCarrinho.setOnClickListener(v -> {
            navBottomView = ((AppCompatActivity) this.context).findViewById(R.id.nav_view);
            BadgeDrawable badgeDrawable = navBottomView.getBadge(R.id.navigation_carrinho);
            if (badgeDrawable == null) {
                navBottomView.getOrCreateBadge(R.id.navigation_carrinho).setNumber(item.getQuantidade());
            } else {
                int previousValue = badgeDrawable.getNumber();
                badgeDrawable.setNumber(previousValue + item.getQuantidade());
            }
        });

đây là câu trả lời tốt nhất. nhưng lưu ý rằng cần phải kế thừa chủ đề mẹ của bạn từ Theme.MaterialComponents để chúng sử dụng nó.
porya74

3

Câu trả lời của @ Abel là tốt nhất trừ khi bạn đã có một bộ chủ đề phức tạp và không có thời gian để thay đổi tất cả.

Tuy nhiên, nếu a) bạn bị thúc ép về thời gian và nếu bạn đang sử dụng Thanh BottomNavigationView Bar của thư viện tài liệu Google hoặc b) bạn muốn thêm huy hiệu chế độ xem tùy chỉnh của riêng mình - thì câu trả lời được chấp nhận sẽ không hoạt động với com.google.android.material:material:1.1.0

Bạn sẽ cần viết mã cho một hệ thống phân cấp chế độ xem khác với câu trả lời được chấp nhận

  BottomNavigationItemView itemView = (BottomNavigationItemView) ((BottomNavigationMenuView) mBottomNavigation.getChildAt(0)).getChildAt(2);
  View badge = LayoutInflater.from(this).inflate(R.layout.navigation_dot, itemView, false);
  itemView.addView(badge);

nếu bạn muốn cập nhật chủ đề của mình và cập nhật lên

com.google.android.material:material:1.1.0-alpha09

thì tất cả những gì bạn cần làm thay vào đó là

mBottomNavigation.getOrCreateBadge(R.id.navigation_menu_item_one).setNumber(YOUR_NUMBER);

Các chức năng loại bỏ và số chỉ có trong phiên bản 1.1.0-alpha09 (và cao hơn)


2

Hãy xem trang tài liệu: https://material.io/develop/android/components/bottom-navigation-view/

TL; DR: Họ đã không cập nhật các phương pháp chính xác để sử dụng, vì vậy họ đã để lại một lỗi nhỏ trên tài liệu. Để thêm hoặc xóa huy hiệu, hãy làm như sau:

// to remove
bottomNavigationView.removeBadge(R.id.action_settings)

// to add
bottomNavigationView.getOrCreateBadge(R.id.action_settings).apply {
    //if you want to change other attributes, like badge color, add a number, maximum number (a plus sign is added, e.g. 99+)
    number = 100
    maxCharactersCount = 3
    backgroundColor = ContextCompat.getColor(context, R.color.color_red)
}

1

Sử dụng thư viện hỗ trợ BottomNavigationView rất khó. Một giải pháp dễ dàng là sử dụng các thành phần bên ngoài. Một cách dễ dàng để xử lý là: https://github.com/ nhámhike / BottomBar Kiểm tra tài liệu của nó dễ dàng như sau:

BottomBarTab nearby = bottomBar.getTabWithId(R.id.tab_nearby);
nearby.setBadgeCount(5);

// Remove the badge when you're done with it.
nearby.removeBadge/();

3
Đối với bất kỳ ai đọc sách này vào năm 2019, thư viện này không được dùng nữa và đã không được duy trì trong 2 năm.
brandonx

Bạn nói đúng, và ngày nay chúng ta có BottomNavigationView gốc dễ sử dụng hơn nhiều.
Fran

1

Bạn có thể thử cách này:

Đặt TextView bên trong BottomNavigationView để đếm ( BottomNavigationView là một FrameLayout ):

    <android.support.design.widget.BottomNavigationView android:id="@id/bottomMenu" style="@style/bottomMenu">
        <TextView android:id="@id/bottomMenuSelectionsNumber" style="@style/bottomMenuSelectionsNumber"/>
    </android.support.design.widget.BottomNavigationView>

Và tạo kiểu cho chúng như thế này:

<style name="bottomMenu">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">@dimen/toolbarHeight</item>
    <item name="android:layout_gravity">center|bottom</item>
    <item name="android:background">@color/colorThird</item>
    <item name="itemBackground">@drawable/tabs_ripple</item>
    <item name="itemIconTint">@drawable/bottom_menu_item_color</item>
    <item name="itemTextColor">@drawable/bottom_menu_item_color</item>
    <item name="menu">@menu/bottom_menu</item>
</style>

<style name="bottomMenuSelectionsNumber">
    <item name="android:text">@string/bottomMenuSelectionsNumber</item>
    <item name="android:textSize">@dimen/appSecondFontSize</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:layout_width">@dimen/bottomMenuSelectionsNumberDim</item>
    <item name="android:layout_height">@dimen/bottomMenuSelectionsNumberDim</item>
    <item name="android:layout_gravity">right|bottom</item>
    <item name="android:layout_marginRight">@dimen/bottomMenuSelectionsNumberMarginR</item>
    <item name="android:layout_marginBottom">@dimen/bottomMenuSelectionsNumberMarginB</item>
    <item name="android:gravity">center</item>
    <item name="android:includeFontPadding">false</item>
    <item name="android:background">@drawable/bottom_menu_selections_number_bg</item>
</style>

bottom_menu_selices_number_bg :

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color="@color/colorAccent"/>
    <corners android:radius="@dimen/cornerRadius"/>
</shape>

0

tôi đã thực hiện một số thay đổi câu trả lời của @ilbose, tôi đã làm theo cách này và thử nghiệm kích thước màn hình nhỏ và lớn

../drawable/badge_circle.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="@color/solid_red_base" />

và ../layout/notifcation_badge.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/badge_frame_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="11dp"
android:layout_gravity="center_horizontal">

<TextView
    android:id="@+id/badge_text_view"
    android:layout_width="12dp"
    android:layout_height="12dp"
    android:textSize="11sp"
    android:textColor="@android:color/white"
    android:background="@drawable/message_badge"
    android:layout_gravity="top"
    android:layout_centerHorizontal="true"
    android:padding="2dp"/> </RelativeLayout>

và trong mã java

 public static void showBadge(Context context, BottomNavigationView
        bottomNavigationView, @IdRes int itemId, String value) {
    BottomNavigationItemView itemView = bottomNavigationView.findViewById(itemId);
    View badge = LayoutInflater.from(context).inflate(R.layout.message_notification_badge, bottomNavigationView, false);

    TextView text = badge.findViewById(R.id.badge_text_view);
    text.setText(value);
    itemView.addView(badge);
}

 public static void removeBadge(BottomNavigationView bottomNavigationView, @IdRes int itemId) {
    BottomNavigationItemView itemView = bottomNavigationView.findViewById(itemId);
    if (itemView.getChildCount() == 4) {
        itemView.removeViewAt(4);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.