如何使用 Kotlin 在 android 中的 BottomNavigationView 上设置 OnNavigationItemListener?
Posted
技术标签:
【中文标题】如何使用 Kotlin 在 android 中的 BottomNavigationView 上设置 OnNavigationItemListener?【英文标题】:How to setOnNavigationItemListener on BottomNavigationView in android using Kotlin? 【发布时间】:2017-11-20 12:40:50 【问题描述】:我使用 kotlin-android-extension,我可以将 bottomNavigationView
id 从布局文件调用到 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;
);
【问题讨论】:
在android studio中使用java to kotlin转换器 这个应用一开始就已经使用了kotlin,所以我只能写kotlin吧?不要在 kotline 文件中写 Java。 只是意识到你可以复制粘贴它并自动转换它 【参考方案1】:你可以使用这种格式的代码:
bottomNavigation.setOnNavigationItemSelectedListener item ->
when (item.itemId)
R.id.action_favorites ->
R.id.action_schedules ->
R.id.action_music ->
true
【讨论】:
那个“真”代表什么? 抱歉,在上次编辑期间,“return”表达式被错误地从代码中删除。我现在已经修好了。谢谢。 @克里斯 当我设置返回 true 这个显示错误信息,只有 false 保持错误干净。?那是什么.. 它不适用于return true
,您必须将 else -> true
添加到 when 块中。否则你会得到错误“当表达式必须详尽时,添加必要的 else 分支”
@Glory 如何在项目中设置一个默认菜单项?【参考方案2】:
你可以使用下面的代码
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
【讨论】:
为什么要在返回词后面加上@setOnNavigationItemSelectedListener? 错了!当设置监听器时,when只执行一次,所以它不等同于问题中的java代码【参考方案3】:使用必须添加注释以仅返回 lambda
bottomNavigation.setOnNavigationItemSelectedListener item ->
when(item.itemId)
R.id.home ->
R.id.group ->
R.id.profile ->
return true
【讨论】:
错了!当设置了监听器时,when只执行一次,所以它不等同于问题中的java代码【参考方案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 语句。
【讨论】:
【参考方案5】:这是我使用新导航组件的代码。 如果您需要有关导航 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
【讨论】:
【参考方案6】:在每个块中返回布尔值,因为 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
【讨论】:
以上是关于如何使用 Kotlin 在 android 中的 BottomNavigationView 上设置 OnNavigationItemListener?的主要内容,如果未能解决你的问题,请参考以下文章
Android 上的 Kotlin:如何在片段中使用数据库中的 LiveData?
如何使用 Kotlin 从 android 中的资产中读取 json 文件?
如何使用 Kotlin 从 Android 中的片段访问另一个片段?
如何将 Kotlin 错误链接到 Android Studio 中的源?