Android进阶宝典—在Compose中跳转Fragment

news2024/11/15 9:22:09

使用场景
我们原有的项目中基本采用的是单Activity架构,页面之间的跳转都是通过Navigation进行的,举个简单的例子。
在这里插入图片描述

在这种单Activity架构模式下,有一天我们想把MainActivity或者BFragment使用Compose重构,这个时候我们就需要去处理页面跳转事件,即从Compose中跳转到Fragment,处理这种问题的方式有很多,比如:

  1. 将要跳转的Fragment修改为Activity,然后在点击事件中startActivity
  2. 针对有页面跳转事件的UI采用原生方式编写与Compose混合使用
  3. 将要跳转的Fragment包装成Compose页面,构建统一路由

第1种方式违背了单Activity架构直接不考虑,第2种方式当点击事件多的时候代码会非常丑陋,并且不满足首页就是ListView的场景。

综合考虑我觉得第三种方法可能最适合一些。接下来,我们来看如何使用第3种方式处理这个问题。

场景复现

复现的场景比较简单,我们直接编写一个Compose页面,Compose页面中有一个Button事件。

@Composable
fun MainPage(){
    Button(onClick = {
       //点击事件
    }) {
        Text(text = "跳转Fragment")
    }
}

创建一个 BlankFragment,里面有一个TextView,给TextView一个点击事件,用来验证跳转后Fragment的功能是正常的。

val v = inflater.inflate(R.layout.fragment_blank, container, false)
val tvName:TextView = v.findViewById(R.id.tvName)
tvName.setOnClickListener {
     Toast.makeText(requireContext(),"我是正常的",Toast.LENGTH_SHORT). show ()
} 

接下来我们就要开始采用方案3解决这个问题了。

解决方案

构建路由

Compose页面之间的跳转也需要使用到Navigation,所以我们先构建好路由。之前我已经分享过在Compose中使用Navigation的教程。可以参考:

juejin.cn/post/710155…

所以这里我们只给出实现方案,Navigation的使用教程可以参考上文链接。

首先我们定义好路由地址,ROUTE_PAGEONE就是我们的第一个页面,ROUTE_FRAGMENT是我们要跳转到的Fragment页面,代码如下所示。

object RouteConfig {

    /**
     * 页面1路由
     */
    const val ROUTE_PAGEONE = "pageOne"

    /**
     * Fragment的路由
     */
    const val ROUTE_FRAGMENT = "Fragment"
}

在NavHost中构建好Compose路由,代码如下所示。

@Composable
fun NavHostDemo() {
    val navController = rememberNavController()
    NavHost(navController = navController, startDestination = ROUTE_PAGEONE) {
        composable(ROUTE_PAGEONE) {
            MainPage(navController)
        }
        composable(ROUTE_FRAGMENT) {
            ComposeFragment()
        }
    }
}

接着我们来看ComposeFragment的构建。

包装Fragment

包装Fragment就是典型的Compose和Android XML混合使用的方式,代码比较简单,如下所示。

@Composable
fun ComposeFragment() {

    val context = LocalContext.current
    val fragmentManager = (context as FragmentActivity).supportFragmentManager

    AndroidView(factory = { context ->
        val fragment = BlankFragment.newInstance()
        val view = FrameLayout(context)
        val fragmentContainer = FrameLayout(context)
        fragmentContainer.id = R.id.my_frame_layout
        view.addView(fragmentContainer)
        fragmentManager.beginTransaction()
            .replace(fragmentContainer.id,fragment)
            .commit()
        view
    })
}

我们动态添加一个FrameLayout并且为FrameLayout设置id,然后通过FragmentManager将BlankFragment添加进来即可。

这里一定要注意两件事:

  • 确保Activity继承自FragmentActivity,因为新建的Compose项目默认是继承自ComponentActivity
  • 一定要为FrameLayout设置id,否则会遇到 Can’t add fragment BlankFragment{b122356} (d235c2b6-5461-4b18-8e4d-09e15c87b129) with tag null to container view with no id 的错误

包装好Fragment后,我们就可以直接使用Navigation跳转了,代码修改如下所示:

@Composable
fun MainPage(navController: NavController){
    Button(onClick = {
       navController.navigate(ROUTE_FRAGMENT)
    }) {
        Text(text = "跳转Fragment")
    }
}

写在最后

近期,飞速发展的人工智能,又让许多人(包括我自己)变得心浮气躁,这里温馨提醒:ChatGPT可以提升你的工作效率,但提升不了你的编码能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PasteSpider软件优势介绍

PasteSpider采用.netcore编写,运行于linux服务器的docker/podman里面,涉及的技术或者工具有podman/docker,registry,nginx,top,ssh,git,svn等。 PasteSpider可以更好的为你执行服务的升级和维护工作。支持集群模式安装,也支持单例模式运行。…

如何为 Apple 官方 SwiftUI 示例中的图表元素加上首显动画?

0. 概览 在 Apple 官方教程示例 Animating Views and Transitions 中,苹果为我们展示了如何为 SwiftUI 中的各种视图添加动画和过渡效果。 在示例的最后,我们在完成 3 种不同数据类型(Elevation, Heart Rate, Pace)切换的同时,顺面收获了美美的图表元素动画效果: 不过,…

科研方向与个人思考

文章目录 关于科研选题与方法的若干思考如何选题选题tips确定研究问题之后如何读论文——与一篇优秀论文作者的博弈阅读论文的技巧代码实现过程中成果发表四步走:科技论文的书写顺序学会利用工具科研的正确姿势 研究生时间线个人思考入门一个领域的步骤(…

【有功-无功协调优化】基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化研究(Matlab代码实现)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

Windows 安装 GDAL C++库

Windows 安装 GDAL C库1. 方法1:下载配置网友编译的GDAL版本1.1 下载1.2 配置1.3 测试1.4 缺点2. 方法2:自己编译3. 参考1. 方法1:下载配置网友编译的GDAL版本 1.1 下载 CSDN: GDAL,geos联合编译的库,版本为1.8.0&am…

VMware虚拟机搭建

网络步骤 VMWARE虚拟机NAT模式上网设置 VM虚拟机设置 虚拟机全局设置 启动虚拟机选择【虚拟网络编辑器】 如果需要管理员权限点【更改设置】,没有提示这忽略这一步 选择NAT模式,更改下面的子网IP,改成你需要的任何一个子网网段(…

KDZD608屏蔽服效率测试仪

一、产品概述 KDZD608型屏蔽服效率试验装置(带电作业用屏蔽服屏蔽效率试验装置)是对屏蔽服进效率试验的专用设备,广泛用于电力系统、生产厂家和科研单位不可缺少的检测设备。KDZD608型屏蔽服效率试验装置根据最新国家标GB6568.2-86《带电作业…

9.含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度

说明书 MATLAB代码:含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度 关键词:冰蓄冷空调 CCHP-MG 多时间尺度优化 冷热电联供 参考文档:《含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度》完全复现 仿真平台:MATLAB yal…

算法学习day57

算法学习day57 1.力扣647. 回文子串1.1 题目描述1.2分析1.3 代码 2.力扣 516.最长回文子序列2.1 题目描述2.2 分析2.3 代码 3.参考资料 1.力扣647. 回文子串 1.1 题目描述 题目描述: 给定一个字符串,计算这个字符串中有多少个回文子串。 具有不同开始…

TenserRT(一)模型部署简介

第一章:模型部署简介 — mmdeploy 0.12.0 文档 pytorch.onnx.export方法参数详解,以及onnxruntime-gpu推理性能测试_胖胖大海的博客-CSDN博客 我们来谈谈ONNX的日常 - Oldpan的个人博客 初识模型部署 训练:网络结构(深度学习框…

【Windows】更换笔记本键盘操作

目录 一、拆旧 1、电脑保持关机状态 2、拆下电池 3、拧开中间这块区域的螺丝 4、拿键盘进行对照,找到对应的固定键盘的螺丝的位置,拧开 5、直接撬起原本的键盘,注意不要扯到下面的排线,小心点 二、换新 6、换新键盘&#…

公司新招了个腾讯拿38K的人,让我见识到了什么才是测试天花板···

5年测试,应该是能达到资深测试的水准,即不仅能熟练地开发业务,而且还能熟悉项目开发,测试,调试和发布的流程,而且还应该能全面掌握数据库等方面的技能,如果技能再高些的话,甚至熟悉分…

ubuntu_修改libc.so.6 或者 libm.so.6的软链接导致sudo ls 等命令失效的解决方法

1. 背景 运行一个binary 应用程序, 提示报错: /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.27 not found (required by 我的应用程序string 里一下符号标, 确实没有然后下载了一个 glibc-2.27, 安装到 usr/local/下, 并将 libm-2.27.so 和 libc-2.27.so 复制到 /lib/x8…

点云的处理

一、激光点云 激光点云指的是由三维激光雷达设备扫描得到的空间点的数据集,每一个点云都包含了三维坐标(XYZ)和激光反射强度(Intensity),其中强度信息会与目标物表面材质与粗糙度、激光入射角度、激光波长以…

基于imx8m plus开发板全体系开发教程3:Ubuntu 20.04 编译

前言: i.MX8M Plus 开发板是一款拥有 4 个 Cortex-A53 核心,运行频率 1.8GHz;1 个 Cortex-M7 核心,运行频率 800MHz;此外还集成了一个 2.3 TOPS 的 NPU,大大加速机器学习推理。 全文所使用的开发平台均为与NXP官方合作的FS-IMX8…

websorm启动vue项目修改内容后自动运行内存溢出

手动启动vue项目正常运行,修改部分内容保存后会自动重新run一下, 这个时候就报错内存溢出,然后很悲伤的需要再手动重启一下。 (在网上查了好多方法就不单独加链接了) 前3个方法都试过对于我的项目无效,第4…

017 - C++ 中的静态(static)

本期我们将讨论 C 中的 static(静态)。 static 关键字在 C 中有两个意思,这个取决于上下文。 简单了解 第一种情况是在类或结构体外部使用 static 关键字,另一种是在类或者结构体内部使用 static。 基本上我们可以这样理解&am…

背包问题基础与应用

背包问题 理论基础 01背包 背包中的每个物品只能用一次 物品编号重量价值物品1115物品2320物品3430 定义:dp[i][j]表示从下标0-i的物品中任取,放进容量为j的背包的最大价值 初始化: dp [[0] * (bag_size 1) for _ in range(len(weigh…

Java程序内存占用优化实践

目录背景堆内存调整内存还会继续上涨减少线程数量TomcatDubboLogback野线程背景 上了微服务的当,喜欢将服务各种拆分,公有云模式下服务器比较多,还能玩得转。到了私有化部署,有的客户连个技术人员都没有,只想一键启动…

java——《面试题——基础篇》

1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) 3、与平台无关性(JVM是Java跨平台使用的根本) 4、可靠安全 5、支持多线程 2、面向对象…