16

我使用 kotlin-android-extension,我可以将bottomNavigationViewid 从布局文件调用到 kotlin 文件。我可以使用bottomNavigationView.setOnNavigationItemSelectedListener(BottomNavigationView.OnNavigationItemSelectedListener {}),但接下来呢?

据我所知,在 Java 中还有另一个名为 的函数onNavigationItemSelected,但我在 kotlin 中找不到它。

这是我想在 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;
        }
    });
4

6 回答 6

21

您可以使用这种格式的代码:

bottomNavigation.setOnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.action_favorites -> {
        }
        R.id.action_schedules -> {
        }
        R.id.action_music -> {
        }
    }
    true
}
于 2017-06-18T03:01:33.680 回答
9

您可以使用以下代码

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
        }
于 2018-08-23T17:15:30.447 回答
7

使用必须添加注释以仅返回 lambda

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

            R.id.group -> {}

            R.id.profile -> {}
        }
        return true
    }
于 2018-02-03T16:49:36.850 回答
4
bottomNavigationView.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.action_favorites -> { }
                R.id.action_schedules -> { }
                R.id.action_music -> { }
            }
            true
        }

请注意,最后一行似乎错过了 return 关键字,但是

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

来自https://kotlinlang.org/docs/reference/lambdas.html

此外,@setOnNavigationItemSelectedListener 创建了一个

local final fun <anonymous> (it: Menuitem) : Boolean

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

于 2019-11-05T15:19:17.113 回答
4

这是我使用新导航组件的代码。如果您需要有关导航 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
        }
于 2020-01-19T02:20:24.923 回答
2

在每个块中返回布尔值,因为 setOnNavigationItemSelectedListener 需要返回类型

fun initViews() {
    bottomNavigationView.setOnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.action_menu_media -> {
                true
            }
            R.id.action_menu_tag -> {
                true
            }
            R.id.action_menu_home -> {
                true
            }
            else -> {
                true
            }
        }

    }
}
于 2018-02-25T14:35:33.623 回答