schemas.android.com/tools"> <fragment android:id="@+id/FirstFragment" android:name="com.xxx.xxx.FirstFragment..."> <fragment android:id="@+id/SecondFragment" android:name="com.xxx.xxx.SecondFragment...schemas.android.com/tools"> <fragment android:id="@+id/FirstFragment" android:name="com.xxx.xxx.FirstFragment.../> <fragment android:id="@+id/SecondFragment" android:name="com.xxx.xxx.SecondFragment...通过findNavController()就可以得到这个NavController来执行导航了。
Navigation是一种导航的概念,即把Activity和fragment当成一个个的目的地Destination,各目的地形成一张导航图NavGraph,由导航控制器NavController来统一调度跳转...//为导航控制器设置配置类 NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration...); //关联NavigationView和导航控制器 NavigationUI.setupWithNavController(navView, navController...//在目的地发生切换的时候,更新底部导航的选中状态,先不看 navController.addOnDestinationChangedListener(xxx) } boolean onNavDestinationSelected...(MenuItem item,NavController navController) { //导航 navController.navigate(item.getItemId(), null
导航组件的构成 导航组件由三个关键的部分组成: Navigation graph(导航图): 这是一个包含所有位置导航相关信息的XML资源文件。...这里包括应用程序当中的所有单独的内容区域(被称为目标视图),以及连接在应用程序当中各个“目标”的路径。 NavHost: 一个用于展示导航图当中目标视图的空的容器。...NavController: 管理NavHost中的应用程序导航的对象。 当用户在整个应用程序中移动时,NavController会协调NavHost中目标内容的交换。...当我们通过导航浏览我们的应用程序的时候,我们可以通知NavController我们要沿着导航图当中的特定的路径进行导航,或者直接导航到特定的目的地。...接下来NavController可以在NavHost当中显示出适当的目标视图。 导航组件有很多的好处: 可以处理fragment的事务。 默认情况下可以正确的处理好各个事物之间前后的操作。
打开Desgin面板,进入设计模式,在里面我们可以新建我们的目标页面。...接下来我们看到为NavController设置了setGraph(),也就是我们xml里面定义的navGraph,导航布局里面的Fragment及action跳转等信息。...我们发现最后dispatchOnDestinationChanged()这个方法,分发目标界面切换。...,并且创建了用来管理Fragment事务及切换的FragmentNavigator,可以简单的把它理解成连接Fragment和NavController的一个桥梁,同时也提供了包含导航的容器布局。...4.3.2 NavController NavContorller是整个导航组件的核心,通过它来加载xml中fragment节点转化成NavDestination,并保存在栈内,通过navigate()
优点 可视化的页面导航图,可以使用 Android Studio 的 Navigation Editor 来查看和编辑导航图。 通过destination和action完成页面间的导航。...通过NavigationUI类,对菜单、底部导航、抽屉菜单导航进行统一的管理。 主要元素 Navigation Graph。...()添加菜单,则可以通过覆盖Activity的onOptionsItemSelected()以调用onNavDestinationSelected(),从而将菜单项与目标页相关联。...|| super.onOptionsItemSelected(item); } 当我们在Fragment中添加菜单跳转目标页时,需要覆盖目标页面onCreateOptionsMenu...(navView, navController); 导航事件监听 NavController提供了一个名为OnDestinationChangedListener的接口,对页面切换事件进行监听,该接口在页面发生切换或参数改变时调用
而通过Jetpack的导航组件——Navigation,就可以很方便的管理各fragment之间的切换,让开发变得更简单。...组成三要素 Navigation graph 一个包含所有导航相关信息的 XML 资源 NavHostFragment 一种特殊的Fragment,用于承载导航内容的容器 NavController 管理应用导航的对象...,而导航视图中通过startDestination指定了默认展示FragmentA。...更多用法 在编辑nav_graph的时候,action属性除了设置目标页外,还可以设置动画、页面间参数传递、fragment回退栈管理等 动画 enterAnim: 进场时目标页面动画 exitAnim...,比如点击通知栏,快速打开目标页面。
NavigationUI 类通过匹配目标页面 id 与菜单 id 实现不同页面之间的导航功能。让我们深入探索一下它的内部机制吧。...= navHostFragment.navController val toolbar = binding.toolbar 要在默认的操作栏 (Action Bar) 中添加导航功能,我在这里使用了...setupWithNavController(navController) } 请注意我并没有从导航图中调用任何导航操作。实际上导航图中甚至没有前往 coffeeList Fragment 的路径。...private fun setupNavigationMenu(navController: NavController){ val sideNavView = findViewByIdnavController) } 现在当我在屏幕较宽的设备上运行应用时,可以看到抽屉式导航栏已经设置了 MenuItem,并且在导航图中,MenuItem
, app:menu属性为底部导航栏指定元素,新建一个bottom_nav_menu的menu资源文件 navController对象,只不过它是继承自NavController的,戳进去构造方法,发现调用了父类的构造方法,再戳进去来到了NavController的构造方法, public NavController...navOptions, navigatorExtras); ...... } 可以看到,在第二个重载方法中,通过findDestination方法传入导航到目标页面的...那么我们是不能在布局文件中通过app:navGraph属性指定自定义的导航资源文件了,只能在布局文件中去掉app:navGraph这个属性,然后在添加FixFragmentNavigator的同时,通过代码将导航资源文件设置进去...(fragmentNavigator) //通过代码将导航资源文件设置进去 navController.setGraph(R.navigation.fix_nav_graph
接下来使用navController来导航到不同的可组合项,下面是官方给出的示例的几种方式: 在导航到“friendslist”并加到返回堆栈中 navController.navigate("friendslist...") 在导航到“friendslist”之前,将所有内容从后堆栈中弹出到“home”(不包含home) navController.navigate("friendslist") { popUpTo...("home") } 在导航到“friendslist”之前,从堆栈中弹出所有内容,包括“home” navController.navigate("friendslist") { popUpTo...("home") { inclusive = true } } 只有当我们还不在“search”时,才能导航到“search”目标地,避免在后堆栈的顶部有多个副本 navController.navigate...("search") { launchSingleTop = true } 例子: 我们给App添加上Scaffold,并在底部导航栏进行navController导航的控制 class NaviActivity
>>>> 传递数据 您可以通过两种方式在目标之间传递数据:使用Bundle对象或使用safeargs Gradle插件以类型安全的方式传递数据。...导航架构组件有一个名为safeargs的Gradle插件,它生成简单的对象和构建器类,以便对目标和动作指定的参数进行类型安全访问。...>>>> Deeplink-深度链接跳转 在Android中,深层链接是指向应用中特定目标的URI。类似Activity的scheme协议。...,我们需要在目标的Activity中重写onSupportNavigateUp,以确保导航器能够正确的回退栈。...在oncreate的时候实例化NavController,它才是真正处理导航的,并且把FragmentNavigator实例化添加到SimpleNavigatorProvider @Override
导航是发生在应用的目标示图之间——用户可以导航到应用当中的任何的位置。...将这些目标视图通过操作来连接起来。 导航图是包括所有的目标视图和操作的一个资源文件,这个导航图标代表了我们应用的所有的导航路径图。...然后我们直接拖NavHostFragment 的视图到我们的activity文件当中 在导航视图当中添加目标视图 这里总共有三种不同的方式可以在我们的导航视图当中添加目标视图 添加已经存在的目标视图 如果我们想把已经存在的目标视图想要添加在导航图当中...导航到目标视图,我们需要用到NavController,它是用于管理NavHost中的应用程序导航的对象。...每个NavHost都有自己的相应NavController。
添加完了依赖,就得先来简单介绍一下这个Navigation了,Navigation分为三大件:导航图、NavHost、NavController。...现在要从A切换到B 导航图:读取这个切换目标及路径 NavHost:包含A、B、C的容器,用于显示Fragment。...NavController:在得知切换目标时,控制NavHost去显示B这个Fragment。 这么一说,你是否有一些理解了呢? 2....这个是用来控制NavHost显示Fragment,虽然我刚才在导航图nav_graph.xml中指明了第一个要显示的Fragment,但是它还缺少这个显示的动机,而这个动机由NavController来提供...,navController); } } 像这样绑定之后,你现在点击底部导航之后,NavController就会控制NavHost去显示相应的Fragment。
Android Jetpack Navigation Architecture Component 介绍 Navigation导航编辑器作为Android Jetpack和 AndroidX 依赖库的一部分其目标旨在简化...Android开发中导航的实现。...,通过NavController.navigate(R.id.xxxx) 会对应到当前View的某个Action,这样我们就可以跳转了。...,我们需要在目标的Activity中重写onSupportNavigateUp,以确保导航器能够正确的回退栈。...override fun onSupportNavigateUp(): Boolean { return navController.navigateUp() } 最后 好了,导航组件基本的使用就这么多
NavController:管理应用导航的对象,实现Fragment之间的跳转等操作。...action:action标签定义了页面跳转的行为,destination标签定义跳转的目标页,跳转时还可以定义跳转动画。...2.5 NavControlle NavController主要用来管理fragment之间的跳转,每个 NavHost 均有自己的相应 NavController。...可以通过findNavController来获取NavController,然后使用NavController的navigate或者navigateUp方法来进行页面之间的路由操作。...enterAnim:跳转时的目标页面动画 exitAnim: 跳转时的原页面动画 popEnterAnim:回退时的目标页面动画 popExitAnim:回退时的原页面动画 然后,打开Code面板,生成的代码如下
跳转的路由目标节点,NavDestination又是如何创建的。 分析后是否能总结出Navigation的优点和痛点 能否解决痛点,该如何解决,有什么思路?...回退等核心操作 NavDestination 节点的封装类对应nav_graph.xml文件中的 , , 目标节点...这样做的理由是,Navigation框架作为路由导航,可以不用Fragment和Dialog,但不能没有启动页和Activity路由跳转类。...navController) { navController.getNavigatorProvider().addNavigator( new DialogFragmentNavigator...mBackStack,如果回退栈为空,那么mGraph一定是第一个添加的元素 把新的目标NavDestination也加入进回退栈 经过这里,导航具有了返回栈的能力。
1 在JetPack中有一个组件是Navigation,顾名思义它是一个页面导航组件,相对于其他的第三方导航,不同的是它是专门为Fragment的页面管理所设计的。...它有一个属性startDestination用来定义导航栈的根入口fragment fragment: 顾名思义fragment页面。...通过destination来关联将要跳转的目标fragment。 以上是nav_graph.xml的基本配置。 在配置完之后,我们还需要将其关联到Activity中。...@anim/slide_out_right" /> 29 30 31 ... 32 对应四个动画配置参数 enterAnim: 配置进场时目标页面动画...exitAnim: 配置进场时原页面动画 popEnterAnim: 配置回退pop时目标页面动画 popExitAnim: 配置回退pop时原页面动画 通过上面的配置你可以看到如下效果 ?
多个destination连接起来就组成了一个栈导航图,destination之间连接就是action。...同时,在onCreate的时候,创建了NavController,与mGraphId进行绑定。 使用路由 在Fragment中,可以通过NavController来进行路由,代码如下所示。...这样的API设计,可以让用户传入View后进行遍历,通过查找指定Tag来获取NavController,简化了调用方式。...添加路由动画 路由切换动画是action的属性,当我们使用action进行路由时,可以指定目标Page,和原Page的动画切换效果,它包含下面几个属性。...enterAnim:目标Page进入动画 exitAnim:目标Page进入时,原Page退出动画 popEnterAnim:目标Page退出动画 popExitAnim:目标Page退出时,原Page
多个destination连接起来就组成了一个栈导航图,destination之间连接就是action。...同时,在onCreate的时候,创建了NavController,与mGraphId进行绑定。 使用路由 在Fragment中,可以通过NavController来进行路由,代码如下所示。...路由跳转 通过NavController进行路由跳转,有多种方式,比如通过路由action指定,也可以指定跳转的destination。...添加路由动画 路由切换动画是action的属性,当我们使用action进行路由时,可以指定目标Page,和原Page的动画切换效果,它包含下面几个属性。...enterAnim:目标Page进入动画 exitAnim:目标Page进入时,原Page退出动画 popEnterAnim:目标Page退出动画 popExitAnim:目标Page退出时,原Page
领取专属 10元无门槛券
手把手带您无忧上云