【问题标题】:Change the layout files in the same activity更改同一活动中的布局文件
【发布时间】:2013-03-20 17:50:13
【问题描述】:

我正在使用setContentView(R.layout.main) 来切换同一活动中的视图。我正在调用一些异步任务并在主布局文件上填充数据,之后我通过调用setContentView(R.layout.main) 方法更改视图。

我开始知道我们不应该对同一活动多次使用setContentView 方法。虽然它对我来说很好用。

谁能解释为什么我们不应该对同一个活动多次使用setContentView 方法来改变视图?

它会创建任何与内存相关的异常吗?有人可以澄清一下吗?

【问题讨论】:

  • 我不知道它会导致任何异常。 (如果您在系统内存不足时执行此操作,可能会出现 OutOfMemory 异常。)让我们听听其他人怎么说。

标签: android layout android-view


【解决方案1】:

我认为切换视图不是一个好主意,因为 android 平台已经有强大的框架来处理视图之间的转换并维护与 Activity 关联的每个视图的状态,最好坚持使用现有框架而不是考虑一些复杂的实现,你必须通过这些实现来完成所有这些事情。如果您不需要在应用程序中处理任何这些事情,并且仅当整个应用程序中只有两个或三个屏幕时,您可以尝试切换视图。如果您有复杂的逻辑和创建这些视图所需的大量数据,那么即使基于您的视图的结构,这也不是一个好方法。如果您要添加更多视图,那么另一件事就是向您的应用程序说明功能负载需要处理的Activity会走高。在这种情况下,您将声明和初始化该特定 Activity 中的所有视图,因此维护所有这些视图实例很繁重。如果您想了解更多关于活动和任务的信息,请refer this link

【讨论】:

  • 换句话说,改变视图可能意味着你也改变了一些逻辑,因此,一个新的活动更合适。
  • 我想知道更改视图后分配给前一个视图的内存是否会被释放。还有一件事这个过程会导致任何内存异常。你能澄清这两个问题吗。因为我我正在使用 setContentView 方法来更改视图。
  • 您是否遇到内存异常?
  • 如果您在活动中对该视图有任何引用,则它不会被清除,该引用可以是子子视图,甚至可以是为视图设置的事件侦听器等
  • 到目前为止,我没有收到任何内存异常 Neil
【解决方案2】:

好吧,每次调用 setContentView() 时,您都必须再次查找所有布局,我认为您“可以”做到这一点。但正如here 所讨论的那样,这是建议,因为它显然违反了 android 指南。 Commonsware 也有一些非常重要的点here 最重要的一点是,当您忘记清理视图等内容时,您很容易发生内存泄漏,而 Android 通常会为您处理这些内容。

简而言之,您应该遵循 Android 指南并使用Fragments 或创建一个新的Activity

【讨论】:

    【解决方案3】:

    根据developer docs setContentView(int layoutResID) 是用来

    从布局资源中设置活动内容。资源将被膨胀,将所有顶级视图添加到活动中。

    在最佳实践中,此方法用于在启动时膨胀您的 Activity 布局。这并不意味着如果您继续使用此方法,它将在未来引起问题。引用this问题中的答案

    你的 Activity 上的 setContentView 实际上调用了 Activity 使用的 Window 上的 setContentView,它本身所做的不仅仅是膨胀布局。

    我建议您找到一种替代方法来切换布局,例如使用 ViewPagerFragments 或其他一些 Tabbing 方法,但最终这一切都取决于您想要做什么。

    This 问题也可能会为您提供所需的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多