我有一个与懒惰加载视图/布局性能相关的问题。 有时我们想要动态显示/隐藏多个视图。在这种情况下,我们有四个选择:
哪一个表现最好? 我一直在谷歌搜索,发现ViewStub专门为此设计,但我不确定。也许我错了,或者甚至还有第五种选择,我不知道。您对此有不同的看法或经验吗?谢谢!
答案 0 :(得分:7)
这取决于您想要膨胀自己的视图。您提到的每种方法都有自己的开销,您需要决定在哪里妥协。
View.GONE
。如果它非常复杂或布局更好,则不这样做。ViewFlipper
和ViewSwitcher
旨在为不同视图之间制作动画。其目的不是显示和隐藏单个视图。如果您有不同的视图可以在不同的时间在同一个地方显示,请使用它。ViewStub
只是一个占位符,用更复杂的布局取而代之。ViewStub
一样。如果您需要以编程方式创建或设置视图,那么这可能是一个不错的选择。答案 1 :(得分:2)
2017年,Android团队在支持库v24上发布了AsyncLayoutInflater。在2020年,它属于of Jetpack library。
AsyncLayoutInflater是另一种延迟扩展布局的方法。如API文档所述
Helper类,用于异步扩大布局。要使用,构造 UI线程上的AsyncLayoutInflater实例并调用 inflate(int,ViewGroup,OnInflateFinishedListener)。的 AsyncLayoutInflater.OnInflateFinishedListener将在 膨胀请求完成后的UI线程。
这适用于懒惰或在其中创建的UI部分 对用户交互的响应。这允许UI线程继续 在相对较重的通货膨胀时做出响应和动画 执行。
这是使用AsyncLayoutInflater的代码片段:
button.setOnClickListener { view ->
val container = findViewById(R.id.container)
val asyncLayoutInflater = AsyncLayoutInflater(this@MainActivity)
asyncLayoutInflater.inflate(
R.layout.view_sample,
container,
object : OnInflateFinishedListener() {
fun onInflateFinished(view: View, resId: Int, parent: ViewGroup) {
parent.addView(view)
}
}
)
}