Android Jetpack Navigation组件(六):编程交互

Android Jetpack架构组件Navigation 1、前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。 Android Architecture组件Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件: 带你领略Android Jet... 阅读详情

前言

本章将学习如何以编程的方式与Navigation组件交互。

一、创建NavHostFragment

可以不在XML文件中指定NavHostFragment,而是在运行时动态创建NavHostFragment。

activity_main.xml:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity:

public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 通过NavHostFragment.create()方法创建NavHostFragment
        NavHostFragment finalHost = NavHostFragment.create(R.navigation.nav_graph);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.nav_host_fragment, finalHost)
                .setPrimaryNavigationFragment(finalHost) // equivalent to app:defaultNavHost="true"
                .commit();
    }
}

二、动态设置导航图

常用的场景是通过动态设置导航图去动态设置startDestination。

NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
        .findFragmentById(R.id.nav_host_fragment);

NavController navController = navHostFragment.getNavController();
// 第一步:inflate导航图
NavGraph navGraph = navController.getNavInflater().inflate(R.navigation.nav_graph);
// 第二步:设置startDestination	会覆盖在XML中指定的startDestination
navGraph.setStartDestination(R.id.bFragment);
// 第三步:通过NavController设置导航图       必须最后再调用本方法
navController.setGraph(navGraph);

使用上述方法时,为了避免多次调用NavController.setGraph()方法,注意以下三点:

  1. 不要在XML文件中使用app:navGraph属性
  2. 不要调用NavHostFragment.create(@NavigationRes int)方法
  3. Don’t use any other APIs that rely solely on the R.navigation ID to inflate and set your graph

第三点是我直接从官方文档copy过来的,因为我担心理解错了。
直白翻译是:不要使用任何其他仅仅依赖导航图ID的 API 来加载和设置导航图。

三、NavBackStackEntry

引用NavBackStackEntry类的注释:

Representation of an entry in the back stack of a NavController

翻译:NavBackStackEntry是NavController管理的返回栈的元素

  • 这个返回栈与Fragment返回栈是联动的

  • NavBackStackEntry关联了一个目的地,当目的地在返回栈时,NavBackStackEntry可以提供限定于目的地的Lifecycle、ViewModelStore和SavedStateRegistry。

  • 可以通过NavController获取指定目的地的NavBackStackEntry。

1.返回结果给前目的地

通过NavBackStackEntry的SavedStateHandle的LiveData返回结果给前目的地

假设我们想从B目的地(BFragment)返回数据给A目的地(AFragment)。

第一步:在A目的地(AFragment)通过LiveData监听数据

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    NavController navController = NavHostFragment.findNavController(this);
    // 获取当前NavBackStackEntry的SavedStateHandle的LiveData
    MutableLiveData<String> liveData = navController.getCurrentBackStackEntry()
            .getSavedStateHandle()
            .getLiveData("key");
    liveData.observe(getViewLifecycleOwner(), new Observer<String>() {
        @Override
        public void onChanged(String result) {
            // 处理监听到的数据
            Toast.makeText(getContext(), "result: " + result, Toast.LENGTH_SHORT).show();
        }
    });
}

第二步:在B目的地(BFragment)通过LiveData返回数据

// navController.getPreviousBackStackEntry()获取的是前一个目的地的NavBackStackEntry
navController.getPreviousBackStackEntry().getSavedStateHandle().set("key", result);

注意:如果只处理一次结果,必须要调用SavedStateHandle的remove()方法清除LiveData,否则你重新observe会收到之前的数据

// 清除LiveData
navController.getCurrentBackStackEntry().getSavedStateHandle().remove("key");

如果B目的地是一个DialogFragment,那么A目的地应该这样写:

NavController navController = NavHostFragment.findNavController(this);
// 通过目的地id获取NavBackStackEntry。如果返回栈有两个相同id的目的地,那么返回最上面的。
// 因为configuration change之后getCurrentBackStackEntry()方法获取的是DialogFragment的NavBackStackEntry。
final NavBackStackEntry navBackStackEntry = navController.getBackStackEntry(R.id.aFragment);

// 创建Observer在NavBackStackEntry's lifecycle ON_RESUME时获取返回结果,这里没有用LiveData
final LifecycleEventObserver observer = new LifecycleEventObserver() {
    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        if (event.equals(Lifecycle.Event.ON_RESUME)
                && navBackStackEntry.getSavedStateHandle().contains("keyDialog")) {
            String result = navBackStackEntry.getSavedStateHandle().get("keyDialog");
            // 处理监听到的数据
            Toast.makeText(getContext(), "result: " + result, Toast.LENGTH_SHORT).show();
            // 清除LiveData
            navController.getCurrentBackStackEntry().getSavedStateHandle().remove("keyDialog");
        }
    }
};
// 当前View Lifecycle处于STARTED状态,如果使用DialogFragment设置LiveData的数据会导致前目的地立马更新界面,而不是等待DialogFragment弹出再更新界面
navBackStackEntry.getLifecycle().addObserver(observer);

// 在view destroy后removeObserver
getViewLifecycleOwner().getLifecycle().addObserver(new LifecycleEventObserver() {
    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        if (event.equals(Lifecycle.Event.ON_DESTROY)) {
            navBackStackEntry.getLifecycle().removeObserver(observer);
        }
    }
});

2.获取导航图范围的ViewModel

由于NavBackStackEntry实现了ViewModelStoreOwner接口,所以可以直接通过它获取ViewModel

// 通过目的地id获取NavBackStackEntry。导航图是特殊目的地,NavGraph继承了NavDestination
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.nav_graph);
MyViewModel viewModel = new ViewModelProvider(backStackEntry).get(MyViewModel.class);

导航图内的目的地之间可以通过导航图范围的ViewModel共享数据。

四、最终效果和工程代码

1.最终效果

NavigationProgrammatically

2.工程代码

代码地址

使用Jetpack组件Navigation实现Android开发中页面跳转 目录一、前言1.概述2.导航图的创建(官网)二、基本使用1.依赖配置2.具体实例:使用Navigation实现页面的跳转。2.1.class的创建2.2 、页面布局文件的创建2.3 向 Activity 添加 NavHost2.4导航文件的配置清单2.5、按钮的布局 布局预览2.6、最终实现页面跳转3.导航图的预览4.最终实现预览导航是指支持用户导航、进入和退出应用中不同内容片断的交互Android Jetpack的导航组件可以帮助实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模式, 阅读详情

相关推荐

Android Jetpack架构组件Navigation入坑详解

本文首发于微信公众号「Android开发之旅」,欢迎关注 ,获取更多技术干货 前言 Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,让单 Activity 应用成为首选架构。应用内Fragment页面的跳转则由 Navigation 来处理,开发者无需在处理 FragmentTransaction 的复杂性以及相关的转场动画。 具体使用 在...

weixin_31520435的博客 721

Compose 调用 - 导航 Navigation2

使用配置文件便于管理路线名称。

HugMua的博客 5082

Android Jetpack架构组件()Navigation

一、 Navigation简介 1.1 Navigation诞生背景 采用单个Activity嵌套多个Fragment的UI架构模式,已经被大多数的Android工程师所接受。但是,对于Fragment的管理一直是一件比较麻烦的事情,工程师需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。 在Android中,页面的切换和管理包括应用程序Appbar的管理、Fragment的动画切换以及Fragment之间的参数传递等内容。并且,纯代码的方式使用

xiangzhihong8的专栏 9044

jetpack Navigation 源码原理解析

Navigation 是一个框架,用于在 Android 应用中的“目标”之间导航,该框架提供一致的 API,无论目标是作为 Fragment、Activity 还是其他组件实现。Navigation是管理Fragment之间导航的组件库,特别在实现单个Activity多个Fragment的管理模式更加灵活图解: 2 NavHostFragment.onInflate 3 NavHostFragment.onCreateNavController 4 NavHostFragment.onCreat

半身风雪 1131

Android Jetpack Navigation组件(七):扩展知识

目录一、返回按键1.物理返回按键2.Toolbar返回按键二、返回数据给目的地1.通过NavBackStackEntry2.通过Fragment Result API3.通过共享ViewModel三、借助ParentFragment导航四、通知不使用显式DeepLink五、DialogFragment原则、通过Safe Args给嵌套导航图传递参数 一、返回按键 1.物理返回按键 2.Toolbar返回按键 二、返回数据给目的地 1.通过NavBackStackEntry 2.通过Fragment Res

stephen_sun_的博客 3806

Compose的Navigation(十五)

文章目录一、前言二、依赖三、NavHostController四、NavBackStackEntry五、路由跳转、路由传参七、深度链接八、参考链接 一、前言 之前用写过一版Navigation,不过现在Compose中也对Navigation做了兼容。新的Navigation导航更加灵活,可以实现组件之间的切换, 所以这里也对navigation-compose做下简单的记录。关于之前的Navigation,可以参考以下链接: https://blog.csdn.net/Mr_Tony/article/d

Mr_Tony的专栏 3576

Jetpack-Compose之四 页面跳转(导航)

导航实际上就是页面跳转,因为Compose中每一个@Composable注解标注的方法就可以成为一个视图,所以导航就是用来处理这些视图之间的跳转操作。 Navigation在设计上高度抽象,只负责导航逻辑不关心页面的具体实现,无论是Activity、Fragment甚至是一个已定义View都可以基于Navigation实现导航。当然,Composable也是可以的。

XBlithe的博客 1万+

JetpackNavigation 导航组件( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )

一、Navigation 引入 二、Navigation 特点 三、Navigation 重要组件 四、Navigation 使用流程 1、创建 Fragment 2、创建 Navigation Graph 组件 3、处理 Navigation Graph 组件报错信息 " failed to add navigation dependency " 4、编辑 Navigation Graph 组件 - 创建 action 跳转 5、创建 NavHostFragment 组件 6、在 Activity 中获取

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9149

带你领略Android Jetpack组件的魅力

1、前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。 Android Architecture组件Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件:  带你领略Android Je...

浅谈Android 3万+

Android:安卓学习笔记之navigation的简单理解和使用

Jetpack提供了一个名为Navigation组件,旨在方便开发者管理Fragment页面和Appbar

JMW1407的博客 1万+

Android Jetpack架构组件Navigation入门

——沉默不是因为词穷,而是因为心空。现实有多残酷,你就应该有多坚强。 前言 一、简介 (1)是什么 (2)有什么用 (3)有什么优点 ​二、基本使用 (1)添加依赖 (2)创建navigation视图 (3)Activity中添加NavHost (4)代码实现导航功能 三、组件分析 四、进阶 五、内容推荐 前言 ——这篇主要是梳理一下Jetpack架构...

斌林诚上的博客 4846

Android Jetpack组件Navigation与Room

Navigation 组件Android Jetpack 的一部分,它提供了一种用于在应用内管理不同界面导航的方式。通过使用 Navigation,开发者可以轻松实现界面间的跳转,同时保持代码的简洁和清晰。Room 是一个提供数据库访问抽象层的持久层框架,它将 Java 对象映射到数据库中的表。通过使用 Room,开发者可以轻松实现数据持久化,同时保持代码的简洁和高效。本文详细介绍了 Android Jetpack 组件中的 Navigation 和 Room。

2501_92486623的博客 1010

Android Jetpack Navigation 导航组件的使用

Android Jetpack:Navigation 导航组件的使用 官方介绍 导航组件是一套用于应用内导航的库,工具和指南。该组件将应用程序的所有导航信息集中在导航图中,为实现从简单按钮点击到复杂导航UI模式的所有操作提供了强大的框架。 Android Studio 3.3包含导航编辑器,可以显示导航图。其他功能和优点包括: 自动处理片段交互 正确处理上方和后方 动画和过渡的默认行为 深度链接...

Journey的博客 4138

Android Jetpack 组件库 ->Jetpack Navigation (上)

Jetpack Navigation 通过声明式导航图类型安全传参和深度 UI 集成,显著简化了复杂导航逻辑的开发,尤其适合单 Activity 架构。其可视化工具和标准化 API 降低了维护成本,是构建现代 Android 应用的首选导航方案。Jetpack Navigation 官方文档。

Mark Wu 的博客 1097

Android Jetpack组件Navigation

本文详细介绍了Android Jetpack组件Navigation的功能特点、性能优化以及易于集成的优势。通过使用Navigation组件,开发者可以简化导航管理、提高应用性能,并与其他Jetpack组件协同工作,从而提高开发效率。在未来的发展中,Navigation组件有望继续完善和扩展其功能,为开发者提供更加便捷、高效的页面导航解决方案。同时,开发者也应关注Jetpack组件的更新动态,充分利用这些工具和库来优化应用开发过程。

2501_92489105的博客 677

Android Jetpack组件Navigation使用

Navigation组件旨在帮助开发者轻松实现Android应用中的导航功能。通过使用Navigation,开发者可以简化应用的架构,提高代码的可维护性,同时为用户提供流畅的导航体验。支持多种导航类型:包括 fragment、activity、dialog 等。易于集成:与ViewModel、LiveData等组件无缝集成。强大的图形编辑器:在Android Studio中提供可视化编辑功能。Android Jetpack组件中的Navigation使用,为开发者提供了一个高效、简洁的导航解决方案。

2501_92487231的博客 883

Android Jetpack组件使用指南

Android Jetpack是一套由多个库组成的工具集,旨在帮助开发者更快地构建高质量的应用程序。它涵盖了从架构、界面、测试到工具等多个方面,旨在简化开发流程,提高开发效率。本文详细介绍了Android Jetpack组件的使用方法,包括架构组件、界面组件、测试组件和工具组件。通过掌握这些组件,开发者可以更快地构建高质量的应用程序。在实际开发过程中,开发者应根据项目需求灵活选择和使用这些组件,以提高开发效率和维护性。

2501_92487565的博客 2060

Jetpack - Navigation: 一个全面的安卓开发指南

Jetpack NavigationAndroid Jetpack的一部分,Jetpack是一个库套件,帮助开发者遵循最佳实践,减少样板代码,并在不同版本的安卓之间编写一致的代码。Navigation组件帮助管理导航,从简单的按钮点击到更复杂的模式,如导航抽屉和底部导航。

jiet_h的博客 1112
上一篇: Android Jetpack Navigation组件(五):NavigationUI
下一篇: Android Jetpack Navigation组件(七):扩展知识
scx_
博客等级 码龄10年 8粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值