当前位置: 首页 > news >正文

Compose和AndroidView的交互

1、在ComposeUI中加载AndroidView控件

Compose中可以加载AndroidView还是比较简单的,直接引入AndroidView来加载AndroidView布局文件。

@Composable
fun Greeting(name: String) {
    Column {
        Text(text = "Hello $name!")
        LoadAndroidView(name)
    }
}

/**
 * Compose中加载AndroidView
 */
@Composable
fun LoadAndroidView(name: String) {
    var tvTittle: TextView? = null
    AndroidView(factory = {
        //加载AndroidView布局。
        LayoutInflater.from(it).inflate(R.layout.activity_main, null).apply {
            tvTittle = findViewById(R.id.tvTittle)
        }
    }) {
        //更新UI数据
        tvTittle?.text = name
    }
}

factory参数主要是用来初始化AndroidView布局,将AndroidView布局通过工厂模式转换成ComposeUI加载到Compose中,只会执行一行,第二个回调函数,主要是用来更新UI数据,ReCompose可能会执行,所以我么初始化AndroidView的代码应该放在factory参数中。

2、在AndroidView中加载ComposeUI

AndroidView中引入ComposeView直接在AndroidView的布局文件中加入androidx.compose.ui.platform.ComposeView

控件,在代码中初始化ComposeView,调用setContent方法,就可以使用ComposeUI了。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvTittle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="我是AndroidView" />

    <androidx.compose.ui.platform.ComposeView
        android:id="@+id/composeView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
class LoadComposeActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<ComposeView>(R.id.composeView).apply { 
            setContent { 
                Column {
                    Text(text = "我是ComposeView")
                }
            }
        }
    }
}

3、LiveData数据转换成State数据

LiveData是JetPack组件的一部分,主要是在AndroidView中用来监听数据的变化,并且具有生命感知的,只有在Activity等处于活动才会触发数据更新。

State是Compose中特有的用来更新Ui的数据框架。比如常用的mutableStateOf , mutableListStateOf等。

当AndroidView和Compose交互,将会可能涉及到LiveDataState数据的交换问题。

由于在AndroidView中常用LiveData来进行数据的订阅,而在Compose中使用的是Compose特有的mutableStateOf或者mutableListStateOf等来进行ReCompose ,UI更新,所以当同时存在两者的时候,需要将

LiveData转换成Compose中的State对象,然后才能在Compose中实现订阅功能。

Compose库中提供了一个扩展函数来进行LiveDataState之间进行转换:

1、导入runtime-livedata库

implementation 'androidx.compose.runtime:runtime-livedata:1.2.0'

2、将LiveData数据转换成State数据

private val tittleLv = MutableLiveData("Android")

private fun initView() {
    findViewById<ComposeView>(R.id.composeView).setContent {
        val tittle by tittleLv.observeAsState()
        Column {
            Text(text = tittle.orEmpty(),Modifier.clickable {
                tittleLv.value="测试LiveData转换State"
            })
        }
    }
}

调用observeAsState扩展函数可以将LiveData对象直接转换成State对象,在Compose中使用。

上面代码给Text加了个点击事件改变LiveData数据,Compose中的文本同步改变是成功的。

需要注意的是,observeAsState函数只能在Compose方法中调用。

相关文章:

  • java计算机毕业设计社区物品交易系统源码+系统+数据库+lw文档+mybatis+运行部署
  • Spring AOP快速入门----XML方式和注解方式
  • 读源码学算法之Octree color quantization
  • C#调用C++生成的DLL 找不到入口点 以及 尝试读取或写入受保护的内存
  • 品牌是选择KOC还是KOL?抖音KOC如何进行推广投放?
  • css同时设置最大宽度和最小宽度
  • 微信小程序播放视频的时候如果突然插入一个音频视频就会卡顿一下
  • S7协议下,如何搭建触摸屏与PLC之间无线通信?
  • java SpringBoot 静态方法中获取@Value注入的值
  • 以太坊账户私钥管理之导出、导出keystore 文件
  • byte[] 转换为图片并保存
  • opencv中直方图和颜色跟踪相关:calcHist, calcBackProject, Meanshift和Camshift
  • 敏感词过滤实践
  • 【面试题】公平锁和非公平锁/可重入锁
  • 【字体转换】快速实现繁简字体相互转换
  • 【刷算法】求1+2+3+...+n
  • Hibernate最全面试题
  • HTML5新特性总结
  • HTTP请求重发
  • JavaScript HTML DOM
  • JavaScript的使用你知道几种?(上)
  • Java知识点总结(JavaIO-打印流)
  • Laravel 中的一个后期静态绑定
  • linux安装openssl、swoole等扩展的具体步骤
  • maven工程打包jar以及java jar命令的classpath使用
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 多线程事务回滚
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 记录:CentOS7.2配置LNMP环境记录
  • 聚簇索引和非聚簇索引
  • 你真的知道 == 和 equals 的区别吗?
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • k8s使用glusterfs实现动态持久化存储
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #define与typedef区别
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #微信小程序:微信小程序常见的配置传旨
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (C语言)球球大作战
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (九)c52学习之旅-定时器
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三)终结任务
  • (转)c++ std::pair 与 std::make
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth