我正在使用Kotlin,并使用onGlobalLayout加载图像 View 。通过loadUrl。在不使用afterMeasured的情况下,我的图像加载得很好,但是由于高度为0有时会崩溃。所以我正在考虑使用在我的扩展函数afterMeasured中定义的onGlobalLayout,如下所示。但是,以某种方式根本不会调用onGlobalLayout。我的代码有什么问题?

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ministry)
    actionBar?.setDisplayHomeAsUpEnabled(true)
    model = intent.getSerializableExtra(Constants.ACTIVITY_NAVIGATE_MINISTRY) as Model.Ministries
    actMinistryImage.loadUrl(model.photo)
}

fun ImageView.loadUrl(url: String?, placeholder: Int = R.drawable.ministries_blank) {
    this.afterMeasured {
        val transformation = FixRatioTransformation(this, true)
        Picasso.with(context).load(url).error(placeholder).transform(transformation)
                .placeholder(placeholder).into(this)
    }
}


inline fun <T: View> T.afterMeasured(crossinline f: T.() -> Unit) {
    viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            if (measuredWidth > 0 && measuredHeight > 0) {
                viewTreeObserver.removeOnGlobalLayoutListener(this)
                f()
            }
        }
    })
}

也许这不是Kotlin特有的,但是在我这方面调用onGlobalLayout的方法还不正确?

最佳答案

首先,您应该比较widthheight而不是measuredWidthmeasuredHeight。后一种尺寸仅在测量/布局过程中使用。

其次,您应该确保在布局中正确描述了ImageView。那就是它的layout_widthlayout_height一定不能是wrap_content。此外,其他 View 一定不能导致此ImageView具有0大小。

关于android - Kotlin:onGlobalLayout未被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36526371/

10-10 01:54