Ответ 1
Отвечая на мой собственный вопрос:
Я закончил тем, что добавил 2 ImageViews
с ярлыком и visiblity 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);
}
});
Значок ImageView
, не являющийся частью BottomNavigationView
Элемент drawable не будет выполняться оттенком, который BottomNavigationView
применяется при выборе /un выборе элемента. Также, если вы видите, что ваш значок не появляется, попробуйте дать ему более высокий elevation
8 или 16 или что-то еще. В моем случае мой значок остался BottomNavigationView
, вероятно, потому, что он имеет более высокий уровень или индекс Z.
Я тестировал это с тремя различными размерами экрана, и позиционирование было одинаковым на всех.
Я надеюсь, что это поможет любому, кто сталкивается с подобной проблемой, с официальным BottomNavigationView
.
Также, если у вас есть лучший подход, поделитесь им.