AndroidView與Compose框架交互實(shí)現(xiàn)介紹
1、在ComposeUI中加載AndroidView控件
Compose中可以加載AndroidView還是比較簡(jiǎn)單的,直接引入AndroidView來(lái)加載AndroidView布局文件。
@Composable
fun Greeting(name: String) {
Column {
Text(text = "Hello $name!")
LoadAndroidView(name)
}
}
/**
* Compose中加載AndroidView
*/
@Composable
fun LoadAndroidView(name: String) {
var tvTittle: TextView? = null
AndroidView(factory = {
//加載AndroidView布局。
LayoutInflater.from(it).inflate(R.layout.activity_main, null).apply {
tvTittle = findViewById(R.id.tvTittle)
}
}) {
//更新UI數(shù)據(jù)
tvTittle?.text = name
}
}factory參數(shù)主要是用來(lái)初始化AndroidView布局,將AndroidView布局通過(guò)工廠模式轉(zhuǎn)換成ComposeUI加載到Compose中,只會(huì)執(zhí)行一行,第二個(gè)回調(diào)函數(shù),主要是用來(lái)更新UI數(shù)據(jù),ReCompose可能會(huì)執(zhí)行,所以我么初始化AndroidView的代碼應(yīng)該放在factory參數(shù)中。
2、在AndroidView中加載ComposeUI
AndroidView中引入ComposeView直接在AndroidView的布局文件中加入androidx.compose.ui.platform.ComposeView
控件,在代碼中初始化ComposeView,調(diào)用setContent方法,就可以使用ComposeUI了。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tvTittle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是AndroidView" />
<androidx.compose.ui.platform.ComposeView
android:id="@+id/composeView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>class LoadComposeActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<ComposeView>(R.id.composeView).apply {
setContent {
Column {
Text(text = "我是ComposeView")
}
}
}
}
}
3、LiveData數(shù)據(jù)轉(zhuǎn)換成State數(shù)據(jù)
LiveData是JetPack組件的一部分,主要是在AndroidView中用來(lái)監(jiān)聽(tīng)數(shù)據(jù)的變化,并且具有生命感知的,只有在Activity等處于活動(dòng)才會(huì)觸發(fā)數(shù)據(jù)更新。
State是Compose中特有的用來(lái)更新Ui的數(shù)據(jù)框架。比如常用的mutableStateOf , mutableListStateOf等。
當(dāng)AndroidView和Compose交互,將會(huì)可能涉及到LiveData和State數(shù)據(jù)的交換問(wèn)題。
由于在AndroidView中常用LiveData來(lái)進(jìn)行數(shù)據(jù)的訂閱,而在Compose中使用的是Compose特有的mutableStateOf或者mutableListStateOf等來(lái)進(jìn)行ReCompose ,UI更新,所以當(dāng)同時(shí)存在兩者的時(shí)候,需要將
LiveData轉(zhuǎn)換成Compose中的State對(duì)象,然后才能在Compose中實(shí)現(xiàn)訂閱功能。
Compose庫(kù)中提供了一個(gè)擴(kuò)展函數(shù)來(lái)進(jìn)行LiveData和State之間進(jìn)行轉(zhuǎn)換:
1、導(dǎo)入runtime-livedata庫(kù)
implementation 'androidx.compose.runtime:runtime-livedata:1.2.0'
2、將LiveData數(shù)據(jù)轉(zhuǎn)換成State數(shù)據(jù)
private val tittleLv = MutableLiveData("Android")
private fun initView() {
findViewById<ComposeView>(R.id.composeView).setContent {
val tittle by tittleLv.observeAsState()
Column {
Text(text = tittle.orEmpty(),Modifier.clickable {
tittleLv.value="測(cè)試LiveData轉(zhuǎn)換State"
})
}
}
}
調(diào)用observeAsState擴(kuò)展函數(shù)可以將LiveData對(duì)象直接轉(zhuǎn)換成State對(duì)象,在Compose中使用。
上面代碼給Text加了個(gè)點(diǎn)擊事件改變LiveData數(shù)據(jù),Compose中的文本同步改變是成功的。
需要注意的是,observeAsState函數(shù)只能在Compose方法中調(diào)用。
到此這篇關(guān)于AndroidView與Compose交互實(shí)現(xiàn)介紹的文章就介紹到這了,更多相關(guān)AndroidView Compose內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Eclipse 注釋模板的使用(圖文說(shuō)明)
為提高代碼的可讀性以及后期的可維護(hù)性,為我們的代碼加上規(guī)范化的注釋是很有必要,不僅有利于提高自己的專業(yè)素養(yǎng),也能方便他人2013-12-12
Android CameraX結(jié)合LibYUV和GPUImage自定義相機(jī)濾鏡
之前使用Camera實(shí)現(xiàn)了一個(gè)自定義相機(jī)濾鏡(Android自定義相機(jī)濾鏡 ),但是運(yùn)行起來(lái)有點(diǎn)卡頓,這次用Camerax來(lái)實(shí)現(xiàn)一樣的效果發(fā)現(xiàn)很流暢,在此記錄一下,也希望能幫到有需要的同學(xué)2021-12-12
使用OkHttp包在Android中進(jìn)行HTTP頭處理的教程
HTTP頭部處理是HTTP網(wǎng)絡(luò)編程中的基本操作,安卓中使用OkHttp包(github.com/square/okhttp)進(jìn)行相關(guān)操作當(dāng)然也是得心應(yīng)手,這里我們就來(lái)看一下使用OkHttp包在Android中進(jìn)行HTTP頭處理的教程2016-07-07
Android輕量級(jí)存儲(chǔ)SharedPreferences?MMKV?Jetpack?DataStore方案
這篇文章主要為大家介紹了Android輕量級(jí)存儲(chǔ)SharedPreferences?MMKV?Jetpack?DataStore方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Android修改源碼解決Alertdialog觸摸對(duì)話框邊緣消失的問(wèn)題
在開(kāi)發(fā)的時(shí)候遇到一個(gè)問(wèn)題,就是一觸摸對(duì)話框邊緣外部,對(duì)話框會(huì)自動(dòng)消失。這個(gè)問(wèn)題很糾結(jié)啊,查找了一下發(fā)現(xiàn)從Android 4.0開(kāi)始,AlertDialog有了變化,就是在觸摸對(duì)話框邊緣外部,對(duì)話框會(huì)自動(dòng)消失,查了源碼,找到解決辦法如下2013-11-11
Android App中使用ListFragment的實(shí)例教程
這篇文章主要介紹了Android App中使用ListFragment的實(shí)例教程,ListFragment的內(nèi)容是以列表(list)的形式顯示的Fragment,需要的朋友可以參考下2016-05-05
Android的SurfaceView和TextureView介紹及使用示例
SurfaceView 是一種用于直接將圖形繪制到屏幕的Android組件,下面給大家分享SurfaceView使用示例,它展示了如何在 Android 應(yīng)用中創(chuàng)建并使用,感興趣的朋友一起看看吧2024-12-12
OpenGL關(guān)于glStencilFuncSeparate()和glStencilFunc()函數(shù)的區(qū)別講解
今天小編就為大家分享一篇OpenGL關(guān)于glStencilFuncSeparate()和glStencilFunc()函數(shù)的區(qū)別講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
Androd 勇闖高階性能優(yōu)化之布局優(yōu)化篇
Android性能優(yōu)化方面也有很多文章了,這里就做一個(gè)總結(jié),從原理到方法,工具等做一個(gè)簡(jiǎn)單的了解,從而可以慢慢地改變編碼風(fēng)格,從而提高性能2021-10-10

