IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Jetpack Compose和View的互操作性,安卓开发基础面试题 -> 正文阅读

[移动开发]Jetpack Compose和View的互操作性,安卓开发基础面试题

setContent { // In here, we can call composables!

MaterialTheme {

Greeting(name = “compose”)

}

}

}

}

@Composable

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!”)

}

}

}

}

}

在View中使用Compose


ComposeView内嵌在Xml中:

一个平平无奇的xml布局文件中加入ComposeView:

<?xml version="1.0" encoding="utf-8"?>

<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(TextV
iew(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

例子:

@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

}

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

}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-24 11:01:03  更:2022-01-24 11:03:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:57:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码