2017-02-21 40 views
11

我一直在嘗試在API 25中發佈BottomNavigationView。我想在底部導航欄中的某個菜單項上顯示通知標誌(例如,帶有或不帶有計數的小藍色圓圈)。有沒有辦法在API 25中引入的谷歌官方BottomNavigationView菜單項上顯示通知標誌?

我有一個選擇器可繪製的地方,我添加了檢查真實和檢查錯誤狀態與灰色繪製其上有一個藍點。當用戶導航到其他導航項目時,整個菜單按鈕變成灰色,並且徽章也變爲灰色。我知道這是因爲itemIconTint應用於drawable,這是因爲圖標的一部分不能使用,所以具有不同顏色的徽章。有沒有其他方法可以實現這一目標?

<android.support.design.widget.BottomNavigationView 
    android:id="@+id/bottom_navigation" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="@color/white" 
    app:itemIconTint="@color/selector_bottom_nav" 
    app:itemTextColor="@color/selector_bottom_nav" 
    android:layout_gravity="bottom" 
    app:menu="@menu/menu_bottom_nav"> 
</android.support.design.widget.BottomNavigationView> 

這就是我如何使用它。刪除itemIconTint並以編程方式更改圖標繪製不起作用。

在Android開發人員上我什麼都沒發現,它也很新,網上也沒有東西可用。

有底部導航欄的自定義庫,但我正在尋找其官方支持。

任何想法,任何人?

+0

檢查該庫https://github.com/volders/Badger – myatmins

回答

3

回答我的問題:

我最後決定將2 ImageViews與徽章可繪製和可見性GONE在我的佈局。我計算徽章的定位是這樣的:

private void calculateBadgesPosition() { 
int totalNavItems = 3; 
     for(int i = 0 ; i < bottomNavigation.getChildCount() ; i++) { 
      View view = bottomNavigation.getChildAt(i); 

// Since Y remains same for all badges at least in my case. 
// 1.3 is a factor that fits my placement of badge. 
      double y = getResources().getDisplayMetrics().heightPixels - (view.getMeasuredHeight() * 1.3); 
      if(image2ndItemBadge != null) { 
       float x = getResources().getDisplayMetrics().widthPixels/2 + imageClassroomBadge.getMeasuredWidth()/2; 

       image2ndItemBadge.setX(x); 
       image2ndItemBadge.setY((float)y); 
       image2ndItemBadge.requestLayout(); 
      } 
// Since BottomNavigationView items are equally distributed you can find 
// the right position for 3rd item (in my case last item) by dividing 
// BottomNavigationView width by 3 and then by 2 to get the middle of that 
// item, which was needed in my case. 
      if(image3rdItemBadge != null) { 
       float x = getResources().getDisplayMetrics().widthPixels - ((view.getMeasuredWidth()/totalNavItems)/2); 

       image3rdItemBadge.setX(x); 
       image3rdItemBadge.setY((float)y); 
       image3rdItemBadge.requestLayout(); 
      } 
      // BottomNavigationView count should always be 1 
      // but I observed the count was 2 in API 19. So I break after first iteration. 
      break; 
     } 
    } 

您可以刪除for循環,只是檢查,如果孩子數大於0,並得到那個孩子。我稱上述方法在的onCreate的這樣的端:

ViewTreeObserver viewTreeObserver = getWindow().getDecorView().getViewTreeObserver(); 
      viewTreeObservier.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 
        calculateBadgesPosition(); 
        getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } 
      }); 

徽章ImageViewBottomNavigationView項目不是可繪部分將不會被BottomNavigationView適用於項的選擇/未選擇該着色來實現。此外,如果你看到你的徽章沒有出現,請嘗試給它更高的elevation 8或16或其他。在我的情況下,我的徽章留在BottomNavigationView後面可能是因爲它有更高的海拔或Z指數。

我使用3種不同的屏幕尺寸測試了它,並且所有的定位都是相同的。

我希望這可以幫助任何人遇到與官方BottomNavigationView類似的問題。

此外,如果你有更好的方法,請分享它。

+1

必須這樣做,但感謝分享它。它爲我工作! –

0

實現此目的的一種方法是對每個項目使用兩個圖標 - 一個使用徽章,另一個不使用並以編程方式替換它們。或者,也可以使用單個圖標而不是兩個圖標,並以編程方式繪製徽章。因此,代碼可以是這個樣子(假設你知道每個項目的指標,可以得到Drawable每個):

public static void updateItem(BottomNavigationView bottomNavigationView, int index, Drawable icon) { 
    Menu menu = bottomNavigationView.getMenu(); 
    MenuItem item = menu.getItem(index); 

    if (item != null) { 
     item.setIcon(icon); 
    } 
} 
+0

感謝您的回答。 就像我在問題中提到的那樣,以編程方式更改drawable並沒有幫助。 我已經有了不同的drawable,但只要用戶單擊BottomNavigationView中的其他菜單項,灰色色調就會應用於drawable。顯示該項目不再被選中。該色調默認應用於整個圖像,因此徽章也會變灰。 – Waqas

0

使用Textview創建佈局。

通過爲BottomNavigationView添加BottomNavigationMenuView作爲子視圖來使視圖膨脹。將計數添加到所需菜單。

請參閱下面的鏈接。

https://stackoverflow.com/a/48269868/4675067

相關問題