Compose中添加Android原生控件

一、前言

Compose自身组件有时候并不能完全满足要求,这里演示如何在Compose中添加原生组件及其注意事项

二、示例代码

 @Composable
    fun AndroidTextView(modifier: Modifier) {
   
        AndroidView(
            modifier = modifier,
            factory = {
    ctx ->
//            以下的方式也可以加载Fragment
            val viewGroup = LayoutInflater.from(ctx).inflate(R.layout.ad_banner_fragment, null) as FrameLayout
            viewGroup.post {
   
                Log.e("YM--->","渲染结束")
                showFragment(fragmentManager, viewGroup, adsFragment)
            }
            viewGroup
            },
        )
    }

这里需要注意的是添加布局有三种方式,一种是使用AndroidViewBinding、一种是使用AndroidView。上述是AndroidView的演示,
下面是AndroidViewBinding的演示

AndroidViewBinding(MyFragmentLayoutBinding::inflate) {
   
        val myFragment = fragmentContainerView.getFragment<MyFragment>()
        // ...
    }

三、AndroidView的注意事项

假如在Compose中只是简单的把控件定义完进行显示的话。可以使用加载布局的方式,也可以使用动态生成控件的方式,如下

@Composable
    fun AndroidTextView(modifier: Modifier) {
   
        AndroidView(
            modifier = modifier,
            factory = {
    ctx ->
                val imageView = ImageView(ctx)
                imageView.layoutParams = ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT
                )
                imageView.id = View.generateViewId()
                imageView.setImageResource(R.drawable.ic_rc_track_user)
                imageView
            },
        )
    }

不过该方式仅仅适用于创建控件之前就准备好了数据,然后仅仅是用来显示后续不做其余操作。假如创建一个ViewGroup,后要往里面添加Fragment类似的操作,这时候需要使用到控件id的话,这时候使用会有问题,因为组件并没有完全创建完毕,通过id获取控件的结果是空值或者是另外一个控件,所以需要使用view.post{}的方式等待渲染完成后再做其余操作。这里可以使用定义一个布局,然后使用布局里面的id给ViewGropu赋值id。虽然控件还是找不到,通过findViewById的方式获取的控件还是null,但是在添加到Fragment到时候还是有很大可能创建完毕的。或者使用view.post{}的方式等待渲染结果,这里等待结果的方式不可以使用ViewTreeObserver.OnGlobalLayoutListener来获取,有可能完成的回调不执行。
以上情况在同一个布局中出现多个原生组件时候会在某些手机上有较大概率发生。

四、参考链接

  1. 在 Compose 中使用 View

相关推荐

  1. Compose添加Android原生

    2024-01-27 10:30:03       43 阅读
  2. Android简单

    2024-01-27 10:30:03       30 阅读
  3. Android:自定义

    2024-01-27 10:30:03       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-27 10:30:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-27 10:30:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-27 10:30:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-27 10:30:03       18 阅读

热门阅读

  1. vue3中页面传参汇总

    2024-01-27 10:30:03       40 阅读
  2. sql注入之into outfile语句写入一句话木马

    2024-01-27 10:30:03       41 阅读
  3. 我要成为嵌入式高手之1月26日第十一天!!

    2024-01-27 10:30:03       32 阅读
  4. 04_前后端交互技术之Ajax异步请求

    2024-01-27 10:30:03       28 阅读
  5. RuoYi微服务部署运行报错

    2024-01-27 10:30:03       44 阅读
  6. Midjourney:AI创意的新航程

    2024-01-27 10:30:03       42 阅读
  7. Redis学习指南(23)-Redis的分布式集群插槽的分配

    2024-01-27 10:30:03       32 阅读
  8. Jupyter快捷键的使用 --(编辑模式、命令模式)

    2024-01-27 10:30:03       31 阅读
  9. python实例100第41例:模仿静态变量的用法

    2024-01-27 10:30:03       30 阅读
  10. C++ 01 基础教程 03 变量和常量

    2024-01-27 10:30:03       28 阅读