2021年6月27日星期日

Jetpack Compose和View的互操作性

Jetpack Compose和View的互操作性.

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