Android Navigation 使用

本文介绍如何在Android Studio中为BottomNavigationActivity添加自定义的Fragment,包括修改navigation XML文件及底部菜单图标设置。

在Android studio里新建Bottom Navigation Activity时会自动生成底部有三个按钮的导航栏页面

image.png

image.png

如何新增自己的Fragment

1.新建一个Fragment 页面

2.在res-navigation 下mobile_navigation.xml下新增一个fragment标签

<?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/mobile_navigation"
    app:startDestination="@+id/navigation_home">

    <fragment
        android:id="@+id/navigation_home"
        android:name="com.wewin.testkotlinapplication.lesson2.ui.home.HomeFragment"
        android:label="@string/title_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/navigation_dashboard"
        android:name="com.wewin.testkotlinapplication.lesson2.ui.dashboard.DashboardFragment"
        android:label="@string/title_dashboard"
        tools:layout="@layout/fragment_dashboard" />

    <fragment
        android:id="@+id/navigation_notifications"
        android:name="com.wewin.testkotlinapplication.lesson2.ui.notifications.NotificationsFragment"
        android:label="@string/title_notifications"
        tools:layout="@layout/fragment_notifications" />
    
    <fragment
        android:id="@+id/navigation_my"
        android:name="com.wewin.testkotlinapplication.lesson2.ui.my.MyFragment"
        android:label="@string/my_text"
        tools:layout="@layout/fragment_my"/>
</navigation>

3. 增加底部导航栏按钮

    在res-menu下的bottom_nav_menu.xml下新增

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home" />

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

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

    <item
        android:id="@+id/navigation_my"
        android:icon="@drawable/ic_sharp_person"
        android:iconTint="@color/black"
        android:title="@string/my_text"/>
</menu>

4.在AppBarConfiguration里将新加的导航id配置上

val appBarConfiguration = AppBarConfiguration(
    setOf(
        R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications,R.id.navigation_my
    )
)

效果

image.png

注意:

  1. bottom_nav_menu.xml 下的item id需要和 mobile_navigation.xml 下的fragment id一致
  2. APP主题不能是 Theme.MaterialComponents.Light.NoActionBar 否则会报错 Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
  3. 默认显示的fragment 可以在 mobile_navigation.xml 下修改 startDestination
### 如何使用 Android Jetpack Navigation 组件 #### 设置依赖项 为了能够使用 Navigation 组件,需在项目的 `build.gradle` 文件中添加必要的依赖项。确保已配置最新版本的库[^1]。 ```gradle dependencies { def nav_version = "2.7.0" // 版本号可能有所不同,请查阅官方文档确认最新的稳定版 implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" } ``` #### 创建导航图 (Navigation Graph) 通过 XML 定义应用内的目的地及其之间的路径称为导航图。可以在项目中的 `res/navigation/` 资源文件夹下创建一个新的资源文件来定义此图形结构。 ```xml <?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" android:id="@+id/nav_graph" app:startDestination="@id/startFragment"> <fragment android:id="@+id/startFragment" android:name="com.example.StartFragment"> <!-- 动作 --> <action android:id="@+id/action_start_to_next" app:destination="@id/nextFragment"/> </fragment> <fragment android:id="@+id/nextFragment" android:name="com.example.NextFragment"/> </navigation> ``` #### 配置宿主 Activity 和 FragmentContainerView 为了让应用程序支持导航功能,在活动布局中放置一个 `FragmentContainerView` 或者传统的 `FrameLayout` 来作为容器用于显示目标片段,并设置该视图为 NavHost【^1】。 ```xml <layout ... > ... <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" /> ... </layout> ``` #### 导航到其他目的地方向 利用 `findNavController()` 方法可以找到当前上下文中关联的 NavController 实例,进而调用其 `navigate()` 函数实现页面跳转操作[^4]。 ```java // Java 示例代码 Button buttonNext; buttonNext.setOnClickListener(v -> Navigation.findNavController(v).navigate(R.id.nextFragment)); ``` ```kotlin // Kotlin 示例代码 val buttonNext : Button by lazy { findViewById<Button>(R.id.button_next) } buttonNext.setOnClickListener { findNavController(it).navigate(R.id.nextFragment) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值