ViewStub vs View.GONE vs Inflate vs ViewSwitcher

ald*_*dok 4 android android-layout android-view

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

  1. 在.xml中包含所有布局并使用setVisibility方法(如View.GONE和VIEW.VISIBLE)
  2. 使用ViewFlipper/ViewSwitcher
  3. 使用ViewStub
  4. 以编程方式夸大新布局.

哪一个性能最好?我一直在谷歌搜索,发现ViewStub专门为此设计,但我不确定.也许我错了,或者甚至还有第五种选择,我不知道.您对此有不同的看法或经验吗?谢谢!

tyn*_*ynn 7

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

  1. 如果您的视图非常简单并且不需要初始化很多,那么只需设置它即可View.GONE.如果它相当复杂或布局更好不这样做.
  2. ViewFlipperViewSwitcher旨在不同的视图之间进行动画处理.其目的不是显示和隐藏单个视图.如果您有不同的视图在不同时间在同一位置显示,请使用它.
  3. ViewStub 只是一个占位符,它用一个更复杂的布局取而代之.
  4. 手动完成所有操作就像使用ViewStub没有布局信息一样.如果您需要以编程方式创建或设置视图,这可能是一个不错的选择.


ald*_*dok 6

2017 年,Android 团队在支持库 v24 上发布了 AsyncLayoutInflater。2020 年,它是 Jetpack 库的一部分。

AsyncLayoutInflater 是另一种懒惰地膨胀布局的方法。正如 API 文档所说

用于异步膨胀布局的助手类。要使用,请在 UI 线程上构造 AsyncLayoutInflater 的实例并调用 inflate(int, ViewGroup, OnInflateFinishedListener)。当膨胀请求完成时,将在 UI 线程上调用 AsyncLayoutInflater.OnInflateFinishedListener。

这适用于延迟创建或响应用户交互的 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)
            }
        }
    )
}
Run Code Online (Sandbox Code Playgroud)