【问题标题】:How to setOnNavigationItemListener on BottomNavigationView in android using Kotlin?如何使用 Kotlin 在 android 中的 BottomNavigationView 上设置 OnNavigationItemListener?
【发布时间】: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。
  • 只是意识到你可以复制粘贴它并自动转换它

标签: android android-studio kotlin kotlin-android-extensions


【解决方案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
                  }
              }
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 2023-01-03
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多