님이 작성하신 코드는 제가 모르기 때문에 제가 테스트해 본 것만 말씀 드릴게요.
TabLayout에 TabLayout.OnTabSelectedListener를 설정하시고, BottomNavigationView에는 NaviationBarView.OnItemSelectedListener 를 설정합니다.
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
updateSelectedBottomMenu(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
bottomNavView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int tabPosition = getTabPosition(item);
tabLayout.selectTab(tabLayout.getTabAt(tabPosition))
return true;
}
});
private int getTabPosition(MenuItem item) {
Menu menu = bottomNavView.getMenu();
for (int i = 0; i < menu.size(); i++) {
if (menu.getItem(i).getItemId() == item.getItemId()) {
return i;
}
}
throw new NoSuchElementException("Canot find the tab posiition.");
}
이렇게 하면 BottomNavgationView를 클릭하던, Tab 을 클릭하던 updateBottomMenu가 호출될 겁니다. 이 메소드 안에서 선택된 메뉴를 업데이트 합니다.
private void updateSelectedBottomMenu(int position) [
Menu menu = bottomNavView.getMenu();
for (int i = 0; i < menu.size(); i++) {
MenuItem menuItem = menu.getItem(i);
menuItem.setChecked(false);
}
menu.getItem(position).setChecked(true);
}
아제 탭을 누르던, BottomNaivagationView를 누르던, 현재 선택한 메뉴로 지정이 될 겁니다.