web-dev-qa-db-ja.com

Kotlinを使用してBottomNavigationViewのAndroid=)でsetOnNavigationItemListenerを設定する方法

私はkotlin-Android-extensionを使用しており、レイアウトファイルからkotlinファイルにbottomNavigationView idを呼び出すことができます。 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;
        }
    });
10
j.elmer

次の形式のコードを使用できます。

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

以下のコードを使用できます

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
        }
8
Thanh vũ

ラムダのみを返すには注釈を追加する必要があります

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

            R.id.group -> {}

            R.id.profile -> {}
        }
        return true
    }
7
Ali hasan
bottomNavigationView.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.action_favorites -> { }
                R.id.action_schedules -> { }
                R.id.action_music -> { }
            }
            true
        }

最後の行はreturnキーワードを見逃しているようですが、

ラムダの最後の式は戻り値と見なされます。

から https://kotlinlang.org/docs/reference/lambdas.html

さらに、@ setOnNavigationItemSelectedListenerは、

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

続くものをラップするので、一部の回答では、リスナーが設定されている場合にのみ(1回だけ)whenブロックを実行する効果があり、コールバックは単にtrueを返すステートメントになります。

2
AndrewBloom

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

    }
}
2
jaffar

これは、新しいナビゲーションコンポーネントを使用した私のコードです。 nav 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
        }