如何使用Kotlin在android的BottomNavigationView上设置OnNavigationItemListener?

如何使用Kotlin在android的BottomNavigationView上设置OnNavigationItemListener?,android,android-studio,kotlin,kotlin-android-extensions,Android,Android Studio,Kotlin,Kotlin Android Extensions,我使用kotlin android扩展,可以从布局文件调用bottomNavigationViewid到kotlin文件。我可以使用bottomNavigationView.setOnNavigationItemSelectedListener(bottomNavigationView.OnNavigationItemSelectedListener{}),但下一步是什么 据我所知,在Java中还有另一个函数叫做onNavigationItemSelected,但我在kotlin中找不到它 bo

我使用kotlin android扩展,可以从布局文件调用
bottomNavigationView
id到kotlin文件。我可以使用
bottomNavigationView.setOnNavigationItemSelectedListener(bottomNavigationView.OnNavigationItemSelectedListener{})
,但下一步是什么

据我所知,在Java中还有另一个函数叫做
onNavigationItemSelected
,但我在kotlin中找不到它

bottomNavigationView.setOnNavigationItemSelectedListener(
    new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.action_favorites:

                case R.id.action_schedules:

                case R.id.action_music:

            }
            return true;
        }
    });
这是我想在Java中使用的示例代码,但无法在kotlin中编写

bottomNavigationView.setOnNavigationItemSelectedListener(
    new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.action_favorites:

                case R.id.action_schedules:

                case R.id.action_music:

            }
            return true;
        }
    });

您可以使用以下代码格式:

bottomNavigation.setOnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.action_favorites -> {
        }
        R.id.action_schedules -> {
        }
        R.id.action_music -> {
        }
    }
    true
}

使用必须添加注释才能返回lambda

 bottomNavigation.setOnNavigationItemSelectedListener { item ->
        when(item.itemId){
            R.id.home -> {}

            R.id.group -> {}

            R.id.profile -> {}
        }
        return true
    }
在每个块中返回布尔值,因为setOnNavigationItemSelectedListener需要返回类型

您可以使用下面的代码

bottom_navigation.setOnNavigationItemSelectedListener {
            var selectedFragment: Fragment = A()
            when (it.itemId) {
                R.id.action_item1 -> selectedFragment = A()
                R.id.action_item2 -> selectedFragment = B()
                R.id.action_item3 -> selectedFragment = C()
            }
            val transaction = fragmentManager.beginTransaction()
            transaction.replace(R.id.frame_layout, selectedFragment)
            transaction.commit()
            return@setOnNavigationItemSelectedListener true
        }
注意,最后一行似乎遗漏了return关键字,但是

lambda中的最后一个表达式被视为返回值:

此外,@setOnNavigationItemSelectedListener创建一个

local final fun <anonymous> (it: Menuitem) : Boolean
localfinalfun(it:Menuitem):布尔值

包装下面的内容,因此在某些回答中,这将具有仅在设置侦听器时(仅一次)执行when块的效果,并且回调将只是一个return true语句。

这是我使用新导航组件的代码。 如果您在导航ui方面需要帮助,请告诉我

bottom_nav.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.home -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.mainFragment)
                }
                R.id.search -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.searchFragment)
                }
                R.id.inapppurchases -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.inappPurchasesFragment)
                }
                R.id.settings -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.settingsFragment)
                }
            }
            true
        }

在android Studiot中使用java到kotlin转换器此应用程序从一开始就已经使用kotlin,所以我只能编写kotlin,对吗?不在kotline文件中编写Java。只需意识到您可以复制粘贴它并自动转换它“true”代表什么?抱歉,“return”表达式在上次编辑期间被错误地从代码中删除。我现在已经修好了。谢谢@chris当我设置return true显示错误消息时,只有false保持错误干净。?这是什么..它不能使用
返回true
,您必须将
else->true
添加到when块。否则会出现错误“When expression must executive,add required else branch”@glori如何在项目中设置一个默认menuitem?为什么要在返回单词后添加@setOnNavigationItemSelectedListener?错误!当侦听器被设置时,when只执行一次,因此它与问题中的java代码不同!当侦听器被设置时,when只执行一次,因此它与问题中的java代码不同
bottom_nav.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.home -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.mainFragment)
                }
                R.id.search -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.searchFragment)
                }
                R.id.inapppurchases -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.inappPurchasesFragment)
                }
                R.id.settings -> {
                    findNavController(R.id.nav_host_fragment)
                        .navigate(R.id.settingsFragment)
                }
            }
            true
        }