【问题标题】:ViewStub vs View.GONE vs Inflate vs ViewSwitcherViewStub vs View.GONE vs Inflate vs ViewSwitcher
【发布时间】:2017-01-16 01:29:02
【问题描述】:

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

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

谁的表现最好? 我一直在谷歌搜索,发现 ViewStub 是专门为此设计的,但我不确定。也许我错了,或者我什至不知道第五个选项。您对此有不同的看法或经验吗?谢谢!

【问题讨论】:

    标签: android android-layout android-view


    【解决方案1】:

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

    1. 如果您的视图非常简单并且不需要进行太多初始化,只需将其设置为View.GONE。如果它非常复杂或布局最好不要这样做。
    2. ViewFlipperViewSwitcher 旨在在不同视图之间设置动画。它的目的不是显示和隐藏单个视图。如果您有不同的视图在不同的时间显示在同一个地方,请使用它。
    3. ViewStub 只是一个占位符,它用更复杂的布局替换自己。
    4. 手动执行所有操作就像使用ViewStub,只是没有布局信息。如果您需要以编程方式创建或设置视图,这可能是一个不错的选择。

    【讨论】:

      【解决方案2】:

      2017 年,Android 团队在支持库 v24 上发布了 AsyncLayoutInflater。 2020年部分of Jetpack library

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

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

      这适用于惰性创建的 UI 部分或 对用户交互的响应。这允许 UI 线程继续 在相对较重的充气过程中做出响应和动画 执行。

      这是使用 AsyncLayoutInflater 的代码 sn-p:

      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)
                  }
              }
          )
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-01
        • 2014-08-17
        • 2011-09-18
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 2010-12-09
        • 2017-06-20
        相关资源
        最近更新 更多