首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我找不到任何使用androidx导航体系结构的java示例,用于使用底部导航的单个活动

AndroidX 导航体系结构是一种用于简化 Android 应用程序导航的框架。它提供了一种声明式的方式来管理应用程序的导航逻辑,包括处理底部导航栏的交互。以下是一个使用 AndroidX 导航体系结构的 Java 示例,用于实现带有底部导航的单个活动(Single Activity)应用程序。

基础概念

AndroidX 导航体系结构

  • 提供了一个导航图(navigation graph)来定义应用程序的所有导航目的地。
  • 支持通过 NavController 来处理导航逻辑。
  • 可以与 BottomNavigationView 结合使用,以实现底部导航栏的功能。

相关优势

  • 简化导航逻辑:通过 XML 定义导航图,减少了代码中的导航逻辑。
  • 统一管理:所有导航目的地都在一个地方定义,便于管理和维护。
  • 支持深层链接:可以轻松实现应用的深层链接功能。
  • 兼容性:AndroidX 库提供了向后兼容性,确保应用在不同版本的 Android 上都能正常运行。

类型与应用场景

  • 单活动架构:适用于大多数现代 Android 应用,特别是那些需要复杂导航逻辑的应用。
  • 底部导航栏:常用于电商、社交、新闻等类型的应用,提供快速切换不同功能模块的能力。

示例代码

以下是一个简单的示例,展示如何在单个活动中使用 AndroidX 导航体系结构和 BottomNavigationView

1. 添加依赖

build.gradle 文件中添加必要的依赖:

代码语言:txt
复制
dependencies {
    implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'
    implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
    implementation 'com.google.android.material:material:1.6.1'
}

2. 创建导航图

res/navigation/nav_graph.xml 中定义导航图:

代码语言:txt
复制
<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/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.app.HomeFragment"
        tools:layout="@layout/fragment_home" />
    <fragment
        android:id="@+id/searchFragment"
        android:name="com.example.app.SearchFragment"
        tools:layout="@layout/fragment_search" />
    <fragment
        android:id="@+id/profileFragment"
        android:name="com.example.app.ProfileFragment"
        tools:layout="@layout/fragment_profile" />
</navigation>

3. 设置底部导航栏和 NavController

在主活动的布局文件 activity_main.xml 中添加 BottomNavigationViewNavHostFragment

代码语言:txt
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:menu="@menu/bottom_nav_menu" />
</RelativeLayout>

4. 关联底部导航栏和 NavController

在主活动的 MainActivity.java 中设置 NavControllerBottomNavigationView 的关联:

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        BottomNavigationView bottomNavView = findViewById(R.id.bottom_nav_view);

        NavigationUI.setupWithNavController(bottomNavView, navController);
    }
}

5. 定义底部导航菜单

res/menu/bottom_nav_menu.xml 中定义底部导航菜单项:

代码语言:txt
复制
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/homeFragment"
        android:icon="@drawable/ic_home"
        android:title="Home" />
    <item
        android:id="@+id/searchFragment"
        android:icon="@drawable/ic_search"
        android:title="Search" />
    <item
        android:id="@+id/profileFragment"
        android:icon="@drawable/ic_profile"
        android:title="Profile" />
</menu>

常见问题及解决方法

问题:底部导航栏点击后没有切换 Fragment。 原因:可能是 NavController 没有正确设置,或者 BottomNavigationView 的菜单项 ID 与导航图中的目的地 ID 不匹配。 解决方法:确保 NavController 正确关联到 NavHostFragment,并且 BottomNavigationView 的菜单项 ID 与导航图中的目的地 ID 一致。

通过以上步骤,你应该能够在单个活动中成功实现带有底部导航的 AndroidX 导航体系结构。如果遇到其他具体问题,可以根据错误日志或具体表现进一步排查。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

导航: 多返回栈 | MAD Skills

支持多返回栈 让我们通过这个 仓库 中的高级导航示例来看看实际效果。 该应用由 3 个标签页组成,每个标签页都有它自己的导航流。...为了在导航的早期版本中支持多返回栈,我们需要在该示例的 NavigationExtensions 文件中添加一系列辅助函数。...现在我们的 Activity 布局只包含一个带有单个导航图的 NavHostFragment。...注意这个行为是默认启用的。 最后,让我们运行测试来验证是否一切正常。该应用已经拥有一些验证多返回栈行为的测试。我运行 BottomNavigationTest 并观察每个底部导航行为测试的运行。...如果您的应用使用 BottomNavigationView 或 NavigationView,并且您一直在等待支持多返回栈,您所需要做的仅仅是更新 navigation 和 fragment 依赖库,不需要改变任何代码

82320

Android Studio 3.2新功能特性

导航编辑器 新的导航编辑器与Android Jetpack的导航组件集成,为创建应用的导航结构提供图形视图。导航编辑器简化了应用内目的地之间导航的设计和实现。...要了解更多信息,请阅读 导航编辑器文档。 AndroidX重构 作为Jetpack的一部分,我们正在使用androidx命名空间将Android支持库重构为新的Android扩展库。...如果您有任何未迁移到AndroidX名称空间的Maven依赖关系,Android Studio生成系统也会自动转换这些项目依赖关系。...Lint检查 Lint会检查Java / Kotlin的互操作性 为了确保您的Java代码与Kotlin代码良好的互操作性,新的lint检查会执行Kotlin Interop Guide中描述的最佳实践...建议使用安全修复程序的皮棉检查的一个示例是SyntheticAccessor。

5.5K10
  • 欢迎体验 | Wear OS 版 Compose 开发者预览版

    不过,您需要使用合适的 Wear OS Material、导航及基础开发库,这与您之前在移动应用中所使用的开发库是不一样的。...尽管从技术上说,可以在 Wear OS 上使用移动依赖项,但我们还是建议您使用专用于 Wear 的版本以获取最佳体验。 注意: 我们将在未来版本中添加更多 Wear 可组合项。...如果您认为有任何遗漏,欢迎与我们分享。...: 导航 最后,我们还提供了导航可组合项 SwipeDismissableNavHost,该可组合项与移动设备中 NavHost 的工作原理很像,不过也支持开箱即用的滑动关闭手势 (实际在后台使用 SwipeToDismissBox...下面是一个示例 (代码)。 Scaffold Scaffold 提供了布局结构,以帮助您像移动设备一样,用常见模式排列屏幕,但并非应用栏、悬浮操作按钮 (FAB) 或抽屉式导航栏等模式。

    1.6K10

    浅试Android开发

    Android的架构包括应用层、应用框架、库和Linux内核,允许开发者使用Java、Kotlin等编程语言创建应用。...所以摒弃之前手动配置java环境的方法,直接使用scoop解决这一切,包括java的安装和java版本管理。直接看下面几个指令即可,用过其他包管理工具的话直接就明白了。...活动之间可以通过意图(Intent)进行交互,意图是一种消息机制,用于启动新的活动或与其他应用组件进行通信。通过这种方式,Android应用可以实现多屏幕的用户体验,允许用户在不同的活动之间导航。...Scaffold是一个布局组件,提供了基本的应用结构,如顶部应用栏、底部导航等。innerPadding用于处理内容的内边距,以避免与系统UI重叠。...通过组合不同的UI元素,开发者可以快速构建复杂的界面,同时保持代码的清晰和结构化。虽然我的java依托,但搜搜语法也能直接上手试试。我编写了一个入门常见案例:点击后+1的按钮。

    9520

    为任意屏幕尺寸构建 Android 界面

    我们将会使用 Trackr 作为示例,这是一个开源的任务管理应用,我们最近对该应用进行了更新,使其更好地支持更大屏幕的设备。...△ 更改之前的 Trackr 样式 上图是我们进行更改之前的 Trackr 样式,您会发现不管在什么设备或屏幕下,都会有一个单窗口任务列表以及用于导航到归档或设置页面的底部应用栏。...△ 警告窗口 展开警告可以查看到 Android Studio 是否提供了修改建议,这里关于底部应用栏警告的修改建议就是使用 Navigation Rail、抽屉式导航栏,或使用顶部应用栏代替。...对于 Trackr,我认为使用导航路由更有建设性。而针对 MaterialTextView 的修改建议是要么减少 TextView 的宽度,要么考虑使用多列布局,这里使用多列布局更适合我们的应用。...我们先来进行第一项优化,使用 NavRail 而非底部应用栏,首先我们要考虑的是导航模型,所幸我们不会更改很多具体的视图,仅仅只会更改导航方式,因为 NavRail 会一直存在于整个视图体系中,可以通过它导航到任何其他视图

    4.2K20

    深入浅出 NavigationUI | MAD Skills

    这是第二个关于导航 (Navigation) 的 MAD Skills 系列,如果您想回顾过去发布的内容,请参考下面链接查看: 导航组件概览 导航到对话框 在应用中导航时使用 SafeArgs 使用深层链接导航...我需要在应用中增加一些页面,所以有必要使用抽屉式导航栏或者底部标签栏来辅助用户导航。但是我们该如何使用这些 UI 组件来集成导航功能呢?通过点击监听器手动触发导航动作吗? 不需要!无需任何监听器。...首先我需要添加一个 AppBarConfiguration 对象,NavigationUI 会使用该对象来管理应用左上角的导航按钮的行为。...setupWithNavController(navController) } 请注意我并没有从导航图中调用任何导航操作。实际上导航图中甚至没有前往 coffeeList Fragment 的路径。...要解决这个问题,我会使用另外一个布局文件,它带有 w960dp 限定符,表明它适用于屏幕更大、更宽的设备。

    3K30

    Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)

    运行效果图 Navigation + Fragment制作APP主页面 ---- 前言   我相信你肯定见过这样的App主页面,底部或者顶部有多个按钮,点击之后会切换当前的页面,滑动当前页面也会切换底部按钮...为了方便我介绍下面的三个概念,这里假设有A、B、C三个Fragment。 现在要从A切换到B 导航图:读取这个切换目标及路径 NavHost:包含A、B、C的容器,用于显示Fragment。...它就不报错了,这句话的意思是未使用导航的许可。因为我现在还没有使用这个nav_graph.xml所以要加上这一句话告诉AS,让它放心。等我们真正去使用时,是没有影响的,去不去掉都行。 3....不过保险起见,我还是运行一手。 ? 可以看到,底部的导航栏已经出来了,而且还可以点击,点击之后还有动画效果,并且图标和文字的颜色还有变化,因为实际上我只是放了灰色图标而已。...底部导航栏控制Fragment切换 在上面已经添加了底部导航栏,但是这个导航栏还没有和NavHost绑定起来,所以自然就无法在切换底部导航的同时,改变NavHost中的Fragment。

    10.2K42

    利用BottomNavigationView实现底部标签栏

    在创建页面的“Activity Name”一栏填写新活动的名称,再单击页面右下角的Finish按钮,Android Studio就会自动创建该活动的Java代码及其布局文件。...然后编译运行App,进入刚创建的活动页面,其界面效果如下图所示。可见测试页面的底部默认提供了三个导航标签,分别是Home、Dashboard和Notifications。 ?...BottomNavigationView(底部导航视图),另一个是位于其上占据剩余屏幕的碎片fragment。...总算理清了这种底部导航的实现方式,接下来准备修理修理默认的标签及其频道。...给文本视图填上中文描述,首页频道HomeFragment.java的修改内容示例如下:     public View onCreateView(@NonNull LayoutInflater inflater

    2.2K30

    Android开发笔记(一百六十九)利用BottomNavigationView实现底部标签栏

    在创建页面的“Activity Name”一栏填写新活动的名称,再单击页面右下角的Finish按钮,Android Studio就会自动创建该活动的Java代码及其布局文件。...然后编译运行App,进入刚创建的活动页面,其界面效果如下图所示。可见测试页面的底部默认提供了三个导航标签,分别是Home、Dashboard和Notifications。...BottomNavigationView(底部导航视图),另一个是位于其上占据剩余屏幕的碎片fragment。...总算理清了这种底部导航的实现方式,接下来准备修理修理默认的标签及其频道。...给文本视图填上中文描述,首页频道HomeFragment.java的修改内容示例如下: public View onCreateView(@NonNull LayoutInflater inflater

    1.5K20

    自定义View:手撸一个带FAB凹槽的底部导航栏

    链接:https://juejin.cn/post/7337354931480199208 本文由作者授权发布 前言 底部导航栏相信大部分的Androider都不陌生,毕竟对于绝大多数的应用来说底部导航栏是首页的标配...,也不缺各种花里胡哨不按常理出牌的底部导航栏。...我:......?如果你的FAB移动了,导航栏怎么跟着变化? 同事:没得怎么变化,反正需求没有说要加动画 我:那要是PM要你的导航栏凹陷深度依赖于FAB的位置大小,你要怎么处理?...的特性,设置底部导航栏作为FAB的参照物方便对齐停靠; FAB位移动画以及导航栏凹陷动态变化:自定义导航栏的形状,根据FAB的凹陷深度来动态绘制导航栏。...的值,由此一来可以达到凹槽收缩的效果,按钮向下运动时同理: 另外还需要考虑按钮完全位于导航栏上方时的情况,这种情况下直接使用直线来代替原来的曲线部分。

    26610

    Android经典面试题之Kotlin中如何隐藏DialogFragment和Dialog的导航栏

    DialogFragment隐藏导航栏 在 Android 中,使用 DialogFragment 显示对话框时,如果您希望隐藏系统导航栏(如状态栏和导航键),可以通过设置相关的系统 UI 标志来实现。...-- Your layout content goes here --> 使用 DialogFragment 要显示这个 DialogFragment,可以在活动或其他片段中调用以下代码...Dialog中隐藏导航栏 在 Android 中,如果想在 Dialog 中隐藏系统导航栏(包括状态栏和底部的导航键),可以通过设置窗口属性来实现。...在创建 Dialog 时,可以使用 Window 类提供的一些标志来隐藏导航栏。...systemUiVisibility 属性用于隐藏系统导航栏和状态栏。 通过这些设置,当显示 Dialog 时,它将隐藏系统导航栏和状态栏,实现全屏显示。

    19610

    Android Studio 4.0+ 中新的 UI 层次结构调试工具

    图片成功加载后,您可以改变它的半透明值 (alpha) 来比较现有布局与所选的设计布局之间的区别。 布局检查器示例 现在大家已经了解了布局检查器的使用方式。...那么接下来我们通过实例来看一下如何使用它来解决应用的问题。这里我们有一个简单的示例应用,它包含一个 fragment,其中有一些静态文本和一个图片。...,您会看到一个可爱的 android,但是里面少了一些东西: 底部的导航标签。...看一下布局文件,我们可以看到底部的导航视图是存在的,但是屏幕却没有显示它。...,但是底部的导航栏的位置不对: 有很多方法可以解决这个问题: 我们可以设置 navigation host 和底部导航栏的 layout_weight 参数,或者我们可以将 LinearLayout 换成

    2.5K20

    Android 15新特性,强制edge-to-edge全面屏体验

    当我们在照片墙上进行滚动时,你会发现屏幕底部导航条的颜色会随着滚动而发生变化。...发现了这个现象之后,可能细心的朋友立马就察觉到了,那如果我手机底部的导航栏模式不是这种手势导航栏,而是传统的Back、Home、Task 3按键导航栏,edge-to-edge全面屏体验会变成什么样呢?...另外从Android 10开始,Google引入了手势导航,这使得手机屏幕的左右两侧可以用于触发Back键操作,手机屏幕的底部可以用于触发Home键操作,触发区域如下图中的黄色部分所示。...第一步,在项目的build.gradle文件中添加如下库的依赖: dependencies { // For Java implementation 'androidx.activity...如果你的项目还在使用Java代码,那么可以使用以下写法替代: public class MainActivity extends AppCompatActivity { @Override

    61310

    Android Studio 4.0+ 中新的 UI 层次结构调试工具

    图片成功加载后,您可以改变它的半透明值 (alpha) 来比较现有布局与所选的设计布局之间的区别。 布局检查器示例 现在大家已经了解了布局检查器的使用方式。...那么接下来我们通过实例来看一下如何使用它来解决应用的问题。这里我们有一个简单的示例应用,它包含一个 fragment,其中有一些静态文本和一个图片。...当您运行应用的时候,您会看到一个可爱的 android,但是里面少了一些东西: 底部的导航标签。看一下布局文件,我们可以看到底部的导航视图是存在的,但是屏幕却没有显示它。...在它下面,您可以看到导航栏位于最下方——看来底部的导航栏被挤出了屏幕。 有可能是 navigation host 的尺寸设置错了,我们尝试把它的高度设置为 'wrap_content': 底部的导航栏的位置不对: 有很多方法可以解决这个问题: 我们可以设置 navigation host 和底部导航栏的 layout_weight 参数,或者我们可以将 LinearLayout

    2.5K10

    Navigation的用法

    5.通过NavigationUI类,对菜单,底部导航,抽屉菜单导航进行统一的管理     6.支持深层链接DeepLink 二.Navigation的主要元素   在正式学习Navigation...Graph中的Fragment正是通过NavHostFragment进行展示的   NavController:导航控制器,用于在代码中完成Navigation Graph中具体的页面切换动作   它们三者之间的关系可以通过下面的这段话来理解...会自动处理系统返回键,当用户按下返回键时,系统自动将当前所展示的Fragment退出 app:navGraph="@navigation/nav_graph"/> //用于设置该容器对应的导航图...Gradle 插件,该插件可以生成简单的 object 和 builder 类,以便以类型安全的方式浏览和访问任何关联的参数。...我们强烈建议您将 Safe Args 用于导航和数据传递,因为它可以确保类型安全。这是Android Studio官网的原话。

    30420

    Android Jetpack架构组件(五)之Navigation

    一、 Navigation简介 1.1 Navigation诞生背景 采用单个Activity嵌套多个Fragment的UI架构模式,已经被大多数的Android工程师所接受。...相比之前Fragment的管理需要借助FragmentManager和FragmentTransaction,使用Navigation组件有如下一些优点: 可视化的页面导航图,方便我们理清页面之间的关系...通过destination和action完成页面间的导航 方便添加页面切换动画 页面间类型安全的参数传递 通过Navigation UI类,对菜单/底部导航/抽屉蓝菜单导航进行统一的管理 支持深层链接...Navigation Graph:一个包含所有导航和页面关系相关的 XML资源。 NavHostFragment:一种特殊的Fragment,用于承载导航内容的容器。...,因为在 Android 上用于保存所有状态的总空间是有限的。

    1.4K00

    处理视觉冲突 | 手势导航 (二)

    在系统使用手势导航模式时 (即导航栏变成屏幕底部的一条粗线,也就是导航条),由于导航条有动态色彩调整功能,这个冲突可能不会那么明显。...从实用的角度出发,在日常开发中我建议使用系统窗口区域 insets,它可以更好地满足几乎所有需要使用可点击区域 insets 的用例。...在 Android 10 上,当前唯一的强制区域是屏幕底部的主屏手势区域,系统保留这个区域就可以让用户在任何时候都可以退出当前应用: △ 底部 60dp 即为强制系统手势边衬区 稳定显示边衬区 方法:...使用 Jetpack 使用 insets 时,我建议始终用 Jetpack 中的 WindowInsetsCompat 类,无论您需要的最低 SDK 版本是什么。...我在今年早些时候写了一篇博文,详细介绍了一些使用绑定转换操作显著提高效率的做法。

    2.8K30

    Android中最最常用—Fragment实战篇最详解

    示例一: RadioButton+ Fragment 在之前介绍的你不能错过的RadioButton实践一文中,我们详细介绍了 RadioButton的使用,在示例:实现微信底部Tab效果中,只是实现了底部导航的效果切换...,那怎么使导航上面的内容页面随着底部Tab的切换而改变呢?...示例二: ViewPager+ Fragment 上面初步实现了一个APP的底部导航栏效果,但细心地读者可能会发现,微信的四个主页面是可以左右滑动切换的,而上面的效果只能是点击底部导航Tab进行切换。...因此适用于那些相对静态的页,数量也比较少的那种。...结语 以上就是Fragment的一些常见使用场景,根据示例,可以变换多种使用形式,这就要求我们举一反三,根据具体业务、具体需求灵活运用。赶快在项目中练习使用吧!

    7K62
    领券