How to reference a lambda from inside it?

后端 未结 3 2052
温柔的废话
温柔的废话 2020-12-30 00:44

I am trying to get height of a view in onCreate method but I couldn\'t find any way to remove OnGlobalLayoutListener.

In Java (working):

containerLay         


        
3条回答
  •  悲哀的现实
    2020-12-30 01:14

    What's about extension like this?

    import android.annotation.SuppressLint
    import android.os.Build
    import android.view.View
    import android.view.ViewTreeObserver
    
    inline fun View.doOnGlobalLayout(crossinline action: (view: View) -> Unit) {
        val vto = viewTreeObserver
        vto.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
            @SuppressLint("ObsoleteSdkInt")
            @Suppress("DEPRECATION")
            override fun onGlobalLayout() {
                action(this@doOnGlobalLayout)
                when {
                    vto.isAlive -> {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            vto.removeOnGlobalLayoutListener(this)
                        } else {
                            vto.removeGlobalOnLayoutListener(this)
                        }
                    }
                    else -> {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            viewTreeObserver.removeOnGlobalLayoutListener(this)
                        } else {
                            viewTreeObserver.removeGlobalOnLayoutListener(this)
                        }
                    }
                }
            }
        })
    }
    

    Finally, you can call OnGlobalLayoutListener from View directly

    val view: View = ...
    view.doOnGlobalLayout {
      val width = view?.measuredWidth
      val height = view?.measuredHeight
    }
    

提交回复
热议问题