【问题标题】:Android ReselectedListener for NavigationViewNavigationView 的 Android ReselectedListener
【发布时间】:2020-11-06 09:10:53
【问题描述】:

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 中实现了监听器并从那里添加了它,不需要额外的类)
但是,当我按下后退按钮时,我将能够按下当前目的地的菜单按钮,因为菜单项在 onBackPressed() 上没有更新。


更新 2

    navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
            currentMenuItemId = destination.getId();
        }
    });

这就解决了!

【问题讨论】:

  • 为什么你说NavigationView 没有setOnNavigationItemReselectedListener?;如果我没有得到任何东西,请纠正我
  • @Zain 您的链接指向setNavigationItemSelectedListener,而不是选择RE。按照我的两个链接,你会看到缺少的界面
  • @Zain 你有什么建议吗?
  • 你在使用导航控制器吗?
  • @TahaMalik 是的,我愿意

标签: android navigation-drawer android-navigation android-navigationview android-bottomnavigationview


【解决方案1】:

也许你可以这样做(我做得很快,所以可能会更好!)

    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")
    }

【讨论】:

  • 感谢您的意见!这让我更进一步。单击两次菜单项时效果很好。但是,在按下后退按钮后,这不会阻止重新加载当前视图,因为 newItemSelected 未在 onBackPressed 中更新。请在上面查看我的更新!
  • @Tobi,如果你有你的导航控制器,那么你可以在它上面添加一个 addOnDestinationChangedListener 并且在你有一个目标 id 之后你可以做 when(destination.id) { id.toto -> currentItem =你的IdMenu }
  • 如何根据destination.id获取MenuItem对象? item.id 和 destination.id 一样吗?
  • 我解决了!谢谢! item.id = destination.id :) 当您更新答案时,我会接受它
  • @Tobi,很好,是的,但要小心,因为可能 destination.id 不是 menuItem.id !
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多