Jetpack Compose Interoperability
Compose风这么大, 对于已有项目使用新技术, 难免会担心兼容性.
对于Compose来说, 至少和View的结合是无缝的.
(目前来讲, 已有项目要采用Compose, 可能初期要解决的就是升级gradle plugin, gradle, Android Studio, kotlin之类的问题.)
构建UI的灵活性还是有保证的:
- 新界面想用Compose, 可以.
- Compose支持不了的, 用View.
- 已有界面不想动, 可以不动.
- 已有界面的一部分想用Compose, 可以.
- 有的UI效果想复用之前的, 好的, 可以直接拿来内嵌.
本文就是一些互相调用的简单小demo, 初期用的时候可以复制粘贴一下很趁手.
官方文档:
https://developer.android.com/jetpack/compose/interop/interop-apis
在Activity或者Fragment中全部使用Compose来搭建UI
Use Compose in Activity
class ExampleActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // In here, we can call composables! MaterialTheme { Greeting(name = "compose") } } }}@Composablefun Greeting(name: String) { Text(text = "Hello $name!")}
Use Compose in Fragment
class PureComposeFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return ComposeView(requireContext()).apply { setContent { MaterialTheme { Text("Hello Compose!") } } } }}
在View中使用Compose
动态添加ComposeView
在代码中使用addView()
来添加View对于ComposeView
来说也同样适用:
class ComposeViewInViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(LinearLayout(this).apply { orientation = VERTICAL addView(ComposeView(this@ComposeViewInViewActivity).apply { id = R.id.compose_view_x setContent { MaterialTheme { Text("Hello Compose View 1") } } }) addView(TextView(context).apply { text = "I'm am old TextView" }) addView(ComposeView(context).apply { id = R.id.compose_view_y setContent { MaterialTheme { Text("Hello Compose View 2") } } }) }) }}
这里在LinearLayout
中添加了三个child: 两个ComposeView
中间还有一个TextView
.
起到桥梁作用的ComposeView
是一个ViewGroup
, 它本身是一个View, 所以可以混进View的hierarchy tree里占位,
它的setContent()
方法开启了Compose世界的大门, 在这里可以传入composable的方法, 绘制UI.
在Compose中使用View
都用Compose搭建UI了, 什么时候会需要在其中内嵌View呢?
- 要用的View还没有Compose版本, 比如
AdView
,MapView
,WebView
. - 有一块之前写好的UI, (暂时或者永远)不想动, 想直接用.
- 用Compose实现不了想要的效果, 就得用View.
在Compose中加入Android View
例子:
@Composablefun CustomView() { val state = remember { mutableStateOf(0) } //widget.Button AndroidView( factory = { ctx -> //Here you can construct your View android.widget.Button(ctx).apply { text = "My Button" layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT) setOnClickListener { state.value++ } } }, modifier = Modifier.padding(8.dp) ) //widget.TextView AndroidView(factory = { ctx -> //Here you can construct your View TextView(ctx).apply { layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT) } }, update = { it.text = "You have clicked the buttons: " + state.value.toString() + " times" })}
这里的桥梁是AndroidView
, 它是一个composable方法:
@Composablefun <T : View> AndroidView( factory: (Context) -> T, modifier: Modifier = Modifier, update: (T) -> Unit = NoOpUpdate)
factory接收一个Context参数, 用来构建一个View.
update方法是一个callback, inflate之后会执行, 读取的状态state值变化后也会被执行.
番外篇: 在Compose中显示Fragment
这个场景听上去有点奇葩, 因为Compose的设计理念, 貌似就是为了跟Fragment说再见.
在Compose构建的UI中, 再找地方显示一个Fragment, 有点新瓶装旧酒的意思.
但是遇到的场......
原文转载:http://www.shaoqun.com/a/832912.html
跨境电商:https://www.ikjzd.com/
parenthood:https://www.ikjzd.com/w/2497
wangwei:https://www.ikjzd.com/w/1744
跨境通电子商务平台:https://www.ikjzd.com/w/1329.html
JetpackCompose和View的互操作性.JetpackComposeInteroperabilityCompose风这么大,对于已有项目使用新技术,难免会担心兼容性.对于Compose来说,至少和View的结合是无缝的.(目前来讲,已有项目要采用Compose,可能初期要解决的就是升级gradleplugin,gradle,AndroidStudio,kotlin之类的问题.)构建UI的
barclays:https://www.ikjzd.com/w/2775
heap:https://www.ikjzd.com/w/2012
问题 小白个人怎样做跨境电商? 跨境电商怎么开始,前期准备什么?物流,货源怎么解决?:https://www.ikjzd.com/articles/18103
曝!亚马逊开始暂停供应商的账户,One Vendor真的要来了?:https://www.ikjzd.com/articles/18104
亚马逊排名上不去?巧用Facebook广告推广亚马逊产品!:https://www.ikjzd.com/articles/18105
一个集装箱里竟然涉嫌4个品牌侵权!那什么是仿牌?:https://www.ikjzd.com/articles/18106
女人坐在头上被㖭 他的舌头弄得我爽水好多:http://lady.shaoqun.com/a/248175.html
妈妈说一周一次 妈妈用身体帮孩子度过青春期:http://lady.shaoqun.com/a/247594.html
肮脏的小段落(一):http://lady.shaoqun.com/a/389498.html
一个据说是历史上最黄的笑话,但是它让人想哭:http://lady.shaoqun.com/a/389499.html
富阳青龙峡漂流需要带什么?注意事项?:http://www.30bags.com/a/459334.html
2021年富阳青龙峡漂流开放了吗?开放时间:http://www.30bags.com/a/459335.html