fun 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!”)
}
}
}
}
}
ComposeView内嵌在Xml中:
一个平平无奇的xml布局文件中加入ComposeView
:
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>
<TextView
android:id=“@+id/hello_world”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“Hello from XML layout” />
<androidx.compose.ui.platform.ComposeView
android:id=“@+id/compose_view”
android:layout_width=“match_parent”
android:layout_height=“match_parent” />
使用的时候, 先根据id查找出来, 再setContent:
class ComposeViewInXmlActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_compose_view_in_xml)
findViewById(R.id.compose_view).setContent {
// In Compose world
MaterialTheme {
Text(“Hello 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搭建UI了, 什么时候会需要在其中内嵌View呢?
-
要用的View还没有Compose版本, 比如
AdView
,MapView
,WebView
. -
有一块之前写好的UI, (暂时或者永远)不想动, 想直接用.
-
用Compose实现不了想要的效果, 就得用View.
在Compose中加入Android View
例子:
@Composable
fun 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方法:
@Composable
fun AndroidView(
factory: (Context) -> T,
modifier: Modifier = Modifier,
update: (T) -> Unit = NoOpUpdate
)
factory接收一个Context参数, 用来构建一个View. update方法是一个callback, inflate之后会执行, 读取的状态state值变化后也会被执行.
在Compose中使用xml布局
上面提到的在Compose中使用AndroidView的方法, 对于少量的UI还行. 如果需要复用一个已经存在的xml布局怎么办? 不用怕, view binding登场了.
使用起来也很简单:
- 首先你需要开启View Binding.
buildFeatures {
compose true
viewBinding true
}
-
其次你需要一个xml的布局, 比如叫
complex_layout
. -
然后添加一个Compose view binding的依赖:
androidx.compose.ui:ui-viewbinding
.
然后build一下, 生成binding类, 这样就好了, 哒哒:
@Composable
private fun ComposableFromLayout() {
AndroidViewBinding(ComplexLayoutBinding::inflate) {
sampleButton.setBackgroundColor(Color.GRAY)
}
}
其中ComplexLayoutBinding
是根据布局名字生成的类.
AndroidViewBinding
内部还是调用了AndroidView
这个composable方法.
番外篇: 在Compose中显示Fragment
这个场景听上去有点奇葩, 因为Compose的设计理念, 貌似就是为了跟Fragment说再见. 在Compose构建的UI中, 再找地方显示一个Fragment, 有点新瓶装旧酒的意思.
但是遇到的场景多了, 你没准真能遇上呢.
Fragment通过FragmentManager添加, 需要一个布局容器. 把上面ViewBinding的例子改改, 布局里加入一个fragmentContainer, 点击显示Fragment:
Column(Modifier.fillMaxSize()) {
Text(“I’m a Compose Text!”)
Button(
onClick = {
showFragment()
}
) {
Text(text = “Show Fragment”)
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
[外链图片转存中…(img-4u8t5h34-1713382330701)]
[外链图片转存中…(img-cbRtKzrw-1713382330702)]
[外链图片转存中…(img-yPvHlwxY-1713382330703)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!