问题描述
在BottomNavigationView中可以设置:
bottomNavigationView.setonNavigationItemReselectedListener(item -> {
// do nothing on reselection
});
但是对于NavigationView,此功能不可用。什么是等效的?
更新
感谢 @ande ,我实施了以下操作:
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if (currentMenuItemId == item.getItemId()) {
navDrawer.close();
return true;
}
currentMenuItemId = item.getItemId();
NavigationUI.onNavDestinationSelected(item,navController);
navDrawer.close();
return true;
}
如果我仅通过菜单项进行导航,则效果很好。 (顺便说一句,我只是在Activity中实现了Listener并从那里添加了它,不需要额外的类)
但是,当我按“后退”按钮时,由于菜单项未在onBackpressed()
上更新,因此我将能够按当前目的地的菜单按钮。
更新2
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
@Override
public void onDestinationChanged(@NonNull NavController controller,@NonNull NavDestination destination,@Nullable Bundle arguments) {
currentMenuItemId = destination.getId();
}
});
这解决了!
解决方法
也许你可以这样做(我很快就做到了,也许会更好!)
class ReSelectedListener(val navigationViewCallBack: NavigationViewCallBack) : NavigationView.OnNavigationItemSelectedListener {
var newItemSelected : MenuItem? = null
override fun onNavigationItemSelected(item: MenuItem): Boolean {
if(newItemSelected != null){
if(newItemSelected!!.itemId == item.itemId){
navigationViewCallBack.setOnNavigationItemReselectedListener(item)
}
}
newItemSelected = item
return true
}
}
interface NavigationViewCallBack {
fun setOnNavigationItemReselectedListener(item: MenuItem)
}
之后
class YourFragment :Fragment(),NavigationViewCallBack
和
navigationView.setNavigationItemSelectedListener(ReSelectedListener(this))
并在YourFragment中实现回调方法:
override fun setOnNavigationItemReselectedListener(item: MenuItem) {
TODO("Not yet implemented")
}