簡體   English   中英

使用 jetpack compose 從服務創建視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM