ViewStub vs View.GONE vs Inflate vs ViewSwitcher

时间:2016-09-08 07:53:27

标签: android android-layout android-view

我有一个与懒惰加载视图/布局性能相关的问题。 有时我们想要动态显示/隐藏多个视图。在这种情况下,我们有四个选择:

  1. 在.xml中包含所有布局并使用setVisibility方法(如View.GONE和VIEW.VISIBLE)
  2. 使用ViewFlipper / ViewSwitcher
  3. 使用ViewStub
  4. 以编程方式夸大新布局。
  5. 哪一个表现最好? 我一直在谷歌搜索,发现ViewStub专门为此设计,但我不确定。也许我错了,或者甚至还有第五种选择,我不知道。您对此有不同的看法或经验吗?谢谢!

2 个答案:

答案 0 :(得分:7)

这取决于您想要膨胀自己的视图。您提到的每种方法都有自己的开销,您需要决定在哪里妥协。

  1. 如果您的视图非常简单且无需初始化,请将其设置为View.GONE。如果它非常复杂或布局更好,则不这样做。
  2. ViewFlipperViewSwitcher旨在为不同视图之间制作动画。其目的不是显示和隐藏单个视图。如果您有不同的视图可以在不同的时间在同一个地方显示,请使用它。
  3. ViewStub只是一个占位符,用更复杂的布局取而代之。
  4. 手动完成所有操作就像在没有布局信息的情况下使用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)
            }
        }
    )
}