web-dev-qa-db-fra.com

Comment définirOnNavigationItemListener sur BottomNavigationView dans Android en utilisant Kotlin?

J'utilise l'extension kotlin-Android et je peux appeler bottomNavigationView id du fichier de mise en page vers le fichier kotlin. Je peux utiliser bottomNavigationView.setOnNavigationItemSelectedListener(BottomNavigationView.OnNavigationItemSelectedListener {}), mais quelle est la prochaine étape?

Pour autant que je sache en Java, il existe une autre fonction appelée onNavigationItemSelected, mais je ne la trouve pas dans kotlin.

c'est l'exemple de code que je veux utiliser dans Java mais je ne peux pas l'écrire dans 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

Vous pouvez utiliser ce format de code:

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

Vous pouvez utiliser le code ci-dessous

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ũ

l'utilisation doit ajouter une annotation pour renvoyer le lambda uniquement

 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
        }

notez que la dernière ligne semble manquer le mot-clé return, mais

La dernière expression dans un lambda est considérée comme la valeur de retour:

de https://kotlinlang.org/docs/reference/lambdas.html

De plus, @setOnNavigationItemSelectedListener crée un

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

encapsulant ce qui suit, donc dans certaines réponses, cela aura pour effet d'exécuter le bloc when uniquement lorsque l'écouteur est défini (une seule fois), et le rappel ne sera qu'une instruction true true.

2
AndrewBloom

renvoyer un booléen dans chaque bloc car setOnNavigationItemSelectedListener attend un type de retour

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

Ceci est mon code utilisant le nouveau composant Navigation. Faites-moi savoir si vous avez besoin d'aide avec 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
        }