BottomNavigationView与Navigation架构组件结合使用时,setupWithNavController不生效问题解决

2023-05-16

最近学习jetpack Navigation导航组件时,用BottomNavigationView与Navigation配合完成主页单activity与多fragment导航功能,一切准备就绪,却发现通过BottomNavigationView扩展方法来关联BottomNavigationView与Navigation时不生效,activity代码如下:

package com.dylan.jetpackusage

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.setupWithNavController
import kotlinx.android.synthetic.main.activity_navigation.*

/**
 * Created by Dylan on 2021/7/2.
 * E-mail: andev.hoo@gmail.com
 * desc:
 */
 
class NavigationActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_navigation)
        supportActionBar?.hide()
        val navController = findNavController(R.id.fragmentContainerFcv)
//            supportFragmentManager.findFragmentById(R.id.fragmentContainerFcv)!!.findNavController()

       /* bottomNavigationViewBnv.setOnNavigationItemSelectedListener { menuItem ->
            Log.e("NavigationActivity", "menu id: ${menuItem.itemId}")
            Log.e("NavigationActivity", "group id: ${menuItem.groupId}")
            when (menuItem.itemId) {
                R.id.nav_home -> navController.navigate(R.id.nav_home)
                R.id.nav_message -> navController.navigate(R.id.nav_message)
                R.id.nav_mine -> navController.navigate(R.id.nav_mine)
            }
            return@setOnNavigationItemSelectedListener true
        }*/
        bottomNavigationViewBnv.setupWithNavController(navController)


    }
}

activity的布局文件activity_navigation代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".NavigationActivity">

    <fragment
        android:id="@+id/fragmentContainerFcv"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#f9f9f9"
        app:navGraph="@navigation/nav_graph" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#DDD9D9" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationViewBnv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/bottom_nav_menu" />


</LinearLayout>

导航图文件nav_graph如下:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/nav_home_frag">
    <fragment
        android:id="@+id/nav_home_frag"
        android:name="com.dylan.jetpackusage.fragment.HomeFragment"
        android:label="@string/main_page"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/nav_message_frag"
        android:name="com.dylan.jetpackusage.fragment.MsgFragment"
        android:label="@string/msg"
        tools:layout="@layout/fragment_msg" />

    <fragment
        android:id="@+id/nav_mine_frag"
        android:name="com.dylan.jetpackusage.fragment.MineFragment"
        android:label="@string/mine"
        tools:layout="@layout/fragment_mine" />

</navigation>

选项菜单bottom_nav_menu如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/nav_home"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/main_page" />

    <item
        android:id="@+id/nav_message"
        android:icon="@drawable/ic_notifications_black_24dp"
        android:title="@string/msg" />

    <item
        android:id="@+id/nav_mine"
        android:icon="@drawable/ic_dashboard_black_24dp"
        android:title="@string/mine" />

</menu>

运行效果如下:
在这里插入图片描述

运行之后发现点击底部导航按钮,没有切换到对应fragment,最后排查到,是因为nav_graph导航图中的fragment的id没有与bottom_nav_menu选项菜单中item的id一一对应,将其一一对应即可,这里将nav_graph中fragment的id进行修改,与bottom_nav_menu的保持一致,修改后的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/nav_home">
    <fragment
        android:id="@+id/nav_home"
        android:name="com.dylan.jetpackusage.fragment.HomeFragment"
        android:label="@string/main_page"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/nav_message"
        android:name="com.dylan.jetpackusage.fragment.MsgFragment"
        android:label="@string/msg"
        tools:layout="@layout/fragment_msg" />

    <fragment
        android:id="@+id/nav_mine"
        android:name="com.dylan.jetpackusage.fragment.MineFragment"
        android:label="@string/mine"
        tools:layout="@layout/fragment_mine" />

</navigation>

修改之后,就可以将BottomNavigationView与Navigation进行关联,点击底部选项卡自动切换到对应fragment了。

小结

BottomNavigationView的menu的item的id需要与Navigation的对应的fragment的id保持一致,才能通过*bottomNavigationViewBnv.setupWithNavController(navController)*进行自动关联。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BottomNavigationView与Navigation架构组件结合使用时,setupWithNavController不生效问题解决 的相关文章

  • 类型错误:在导航状态中找不到“路线”

    我在用createMaterialTopTabNavigator来自反应导航 其中我有两个单独的屏幕UpdatesStack and ShopsStack我想从这些屏幕导航到其他屏幕 所以我写的是
  • 从 JSF 操作返回 null 和 "" 之间的区别

    据我了解 当 JSF 操作返回时 空字符串 用户停留在当前页面 但视图已刷新 然而 当动作返回时null用户仍然停留在当前页面 但旧视图被重用 我的问题是 上述说法正确 准确 吗 如果是 那么这意味着什么 具体来说 使用其中一种与另一种对页
  • Bootstrap 3 导航栏 - 无法正确折叠

    导航栏曾经正常工作 但我做了一些更改 它不再工作 当我将窗口缩小时 会显示切换方块 但是当我单击它时 什么也没有发生 Note 导航栏在全屏下工作正常 它只是在小窗口中 当我单击切换按钮时 下拉菜单不会出现 想知道是否有人知道如何解决它 这
  • 如何结合BottomNavigationView和ViewPager?

    我需要帮助来组合 ViewPager 和 BottomNavigationView 但是 当我在 ViewPager 工作时滑动屏幕时 该片段会与另一个片段堆叠在一起 我该如何解决 堆叠片段 在刷卡之前的正常片段上 这是我的代码 MainA
  • 单页网站上复杂的活动状态导航

    HTML div class logo ribbon a href top a div
  • 以编程方式展开/折叠 CoordinatorLayout 中的底部导航视图

    我有一个CoordinatorLayout其中包含一个BottomNavigationView and an AppBarLayout with a ToolBar在它里面 这BottomNavigationView不在里面AppBarLa
  • Android Studio:导航 xml 编辑和设计视图出现问题

    我们一直在项目中使用导航组件 但偶然发现了一个似乎是我们的项目和 JetBrains Android 插件特有的问题 我无法确定它开始发生的确切时间点 但我在 AS 3 2 发布后注意到了它 该项目构建得很好 但是在编辑导航 XML 时 自
  • CSS / HTML 导航和徽标位于同一行

    我不知道如何将它们放在同一条线上 http codepen io anon pen dovZdQ http codepen io anon pen dovZdQ div class navigation bar div img src lo
  • 将字符串标记为 HTML 安全

    我正在尝试构建我的第一个 Rails 应用程序 并且正在使用瑞恩 希思 Ryan Heath 的 navigation helper https github com rpheath navigation helper插件为我提供导航中的当
  • 带下拉图标 V 形的 Bootstrap 手风琴导航

    我有一个引导导航选项卡导航堆叠列表 需要使用手风琴折叠所有列表 除了最近单击的列表或具有活动子项的列表 我有这个工作 但似乎无法弄清楚如何让 V 形改变方向 除非点击 我以前只是将其设置为折叠 而不是手风琴折叠 所以需要一些 javascr
  • 导航到页面会增加内存使用量 Windows Universal 8.1

    我正在创建一个 Windows Universal 8 1 应用程序 每次我导航到一个页面 然后导航回来 然后再次导航到该页面 该页面的新实例就会保存在内存中 显然 垃圾收集器会在一段时间后释放内存 但是如果不需要 我宁愿不使用内存 有没有
  • MvvmCross 5.x 的 MvvmCross 侧边栏导航

    我要为我的应用程序实现两种类型的导航 即侧边栏导航和父子导航 我的应用程序从汉堡 侧边栏 菜单开始 侧边栏菜单中的第一项应执行导航堆栈的重置并打开主视图 主视图控制器应该启动根堆栈导航 因此主视图上的每个按钮都应该打开一个新视图 新视图上的
  • 使用 MvvmCross ShowViewModel 传递复杂的导航参数

    即使使用此处指定的配置的 MvxJsonNavigationSerializer 我的复杂类型也不会从 Show 传递到 Init 方法v3 中导航参数的自定义类型 https stackoverflow com questions 165
  • 如何使用 php 列出目录以在文件夹中导航,而不使用 javascript? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找这个 PHP 函数 列出目
  • jquery导航

    我正在为网站登陆页面创建一个简单的导航 它将用户引导到客户业务的两侧之一 基本上包括当您滚动到一侧时屏幕被分成两半 另一侧淡出 My code HTML div a href retail html Retail a a href resi
  • JSF 2 全局异常处理,导航到错误页面未发生

    我正在开发一个基于 JSF 2 0 的 Web 应用程序 我正在尝试实现一个全局异常处理程序 每当发生任何异常 例如 NullPointerException ServletException ViewExpiredException 等
  • Eclipse 的 Visual Studio Ctrl+Tab 和 Ctrl+Shift+Tab 等效项

    In Visual Studio I always use Ctrl Tab and Ctrl Shift Tab to navigate between documents I see that Eclipse has Ctrl F6 t
  • Flutter:go_router如何将多个参数传递到其他屏幕?

    在普通颤动中 我用来将多个参数传递到其他屏幕 如下所示 Navigator of context push MaterialPageRoute builder gt CatalogFilterPage list list bloc bloc
  • Jetpack Compose:嵌套导航,在嵌套路径中使用底部栏导航

    我的应用程序具有以下结构 并且由于路线 B 有自己的底部导航栏 因此有自己的 NavHost 我如何从屏幕 C 从选项卡栏打开 导航到路线 A Nested Route onboarding route startDestination s
  • 如何在 SwiftUI 中使用带条件检查的按钮进行导航

    Since 导航按钮不再可用 我如何检查条件导航链接为了导航到另一个视图 NavigationLink destination Dashboard userName self userId password self password is

随机推荐