[英]Create a view from a service with jetpack compose
每當我們需要來自服務的視圖時,我們使用以下
val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val v = inflater.inflate(R.layout.mylayout,null) as view
windowManager.addView(v,params)
如果這次使用 @Composable 而不是布局,如何獲得相同的結果?
我使用以下內容在服務中使用 compose,它適用於普通服務和輸入服務。 它只是復制 ComponentActivity 中的內容。
class TranslationOverlayServiceddd : Service(), LifecycleOwner, ViewModelStoreOwner,
SavedStateRegistryOwner {
private val mSavedStateRegistryController = SavedStateRegistryController.create(this)
private var windowManager: WindowManager? = null
private var serviceView: View? = null
override fun onBind(intent: Intent?): IBinder? {
return null
}
private fun addOverlayView() {
serviceView = TranslationPopupView(this)
windowManager!!.addView(serviceView, null)
serviceView?.let { decorView ->
ViewTreeLifecycleOwner.set(decorView, this)
ViewTreeViewModelStoreOwner.set(decorView, this)
decorView.setViewTreeSavedStateRegistryOwner(this)
}
serviceView?.let {
ViewTreeLifecycleOwner.set(it, this)
ViewTreeViewModelStoreOwner.set(it, this)
it.setViewTreeSavedStateRegistryOwner(this)
}
}
override val savedStateRegistry: SavedStateRegistry
get() = mSavedStateRegistryController.savedStateRegistry
private val mLifecycleRegistry = LifecycleRegistry(this)
override fun getLifecycle(): Lifecycle = mLifecycleRegistry
private val store = ViewModelStore()
override fun getViewModelStore(): ViewModelStore = store
private fun handleLifecycleEvent(event: Lifecycle.Event) =
mLifecycleRegistry.handleLifecycleEvent(event)
override fun onCreate() {
super.onCreate()
mSavedStateRegistryController.performRestore(null)
handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
addOverlayView()
}
override fun onDestroy() {
super.onDestroy()
handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
if (serviceView != null) {
windowManager!!.removeView(serviceView)
serviceView = null
}
}
}
在實際視圖中,您將擁有像這樣的實際撰寫代碼
class TranslationPopupView(context: Context) : FrameLayout(context) {
init {
val view = ComposeView(context).apply {
setContent {
TranslationTheme {
Surface(
modifier = Modifier
.height(200.dp)
.fillMaxWidth()
.padding(16.dp),
color = MaterialTheme.colorScheme.background
) {
Text(text = "Here")
}
}
}
}
addView(view)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.