morristech
5/5/2019 - 6:43 PM

Create a lifecycle owner for a view without any boiler plate

Create a lifecycle owner for a view without any boiler plate

import android.view.View
import android.view.View.OnAttachStateChangeListener
import androidx.lifecycle.LifecycleOwner

/** @author Aidan Follestad (@afollestad) */
class ViewLifecycleOwner(view: View) : LifecycleOwner, OnAttachStateChangeListener {

  private val lifecycle = SimpleLifecycle(this)

  init {
    view.addOnAttachStateChangeListener(this)
  }

  override fun getLifecycle() = lifecycle

  override fun onViewAttachedToWindow(v: View?) = lifecycle.onCreate()

  override fun onViewDetachedFromWindow(v: View) = lifecycle.onDestroy()
}

fun View.lifecycleOwner(): LifecycleOwner {
  val tagOwner = getTag(R.id.view_lifecycle_registry) as? ViewLifecycleOwner
  return if (tagOwner != null) {
    tagOwner
  } else {
    val newOwner = ViewLifecycleOwner(this)
    setTag(R.id.view_lifecycle_registry, newOwner)
    newOwner
  }
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <item format="integer" name="view_lifecycle_registry" type="id"/>
</resources>