【问题标题】:Best practices: Layouts on Android (Programmatic vs XML)最佳实践:Android 上的布局(程序化 vs XML)
【发布时间】:2012-04-07 08:11:25
【问题描述】:

这个问题困扰了我一段时间。我已经在 Android 平台上开发了几个应用程序,并且不知何故总是发现自己求助于 Java 代码来构建布局。在专业的开发环境中,这是可以接受的吗?或者 XML 文件应该是首选方法吗?我通常发现 XML 是一种更乏味的方法,而且这些布局通常在所有设备上看起来都不一样。我只是不明白。从专业的角度来看,是否真的有人能够纯粹使用 XML 文件来开发具有复杂视图的应用程序?这个问题让我很生气,因为谷歌建议使用 XML,但 UI 在所有设备上看起来都不一样,除非以编程方式完成。还是我做错了什么?

请注意,我指的是大多数用户使用的 Android 2.2 和 2.3。

【问题讨论】:

    标签: android


    【解决方案1】:

    这真的取决于它是什么类型的项目,或项目的一部分,以及你是什么类型的程序员。有些人只喜欢纯代码,而另一些人则喜欢尽可能多地依赖其他设计工具。

    XML 肯定有一些好处,比如能够在界面设计之间快速切换。对于重复的特定设计主题,对大多数程序员来说绝对有用。

    我个人更喜欢以编程方式完成所有事情,并且使用我创建的库和类进行开发比编写 XML 更快。开箱即用的 XML 更快。

    至于性能,真的没有什么值得一提的区别,除非你在同一时间重复使用相同的视图,以至于它不再适合屏幕很多倍。我测试了 Android 可以在 Moto X - Android 4.4 上呈现多少文本视图,它不能超过 5000,但从来没有这样做的目的。如果你在那个时候,你要么需要动态加载和卸载数据,要么刚开始做一些非常错误的事情。

    所以两边都学,一定要了解自己编程风格的优缺点,因为没有适合每个人的正确答案,放轻松,玩得开心。

    【讨论】:

      【解决方案2】:

      奥卡姆剃刀,

      答案非常很大程度上取决于您的需求、灵活性和知识。首先要了解的是,每个布局,无论是通过 XML 创建还是以编程方式创建,都可以通过属性进行专门调整或使其符合许多屏幕。

      ...不知何故,我总是发现自己求助于 Java 代码来构建布局。在专业的开发环境中,这是否可以接受?

      是的,是的。 Android 提供了这些功能,因此您可以做到这一点。但是,通过 XML 管理布局的好处包括标准的 MVC 隔离、更简单的调试以及在需要时更容易修改资源。此外,您可以根据设备配置轻松维护多个布局副本。

      ...有没有人真的能够完全使用 XML 文件开发具有复杂视图的应用程序?

      绝对!有一些令人惊叹的程序充分利用了 XML 而不是程序化视图。它们的关键是父视图需要多少信息(即非标准视图属性)。即使在这些情况下,只要您知道在哪里以及如何传递这些信息,也有一些方法可以传递这些信息。

      还是我做错了什么?

      我不这么认为。老实说,我根据需要双向运行。我想说这真的归结为你缺乏对怪癖的了解。但工作完成工作。这是一个例子:有时我不知道所有东西需要多大,直到它在设备上运行,有时我让设备符合我的布局需求。最终,我使用下面的图表来做出决定。

      • 除了视图属性之外,我是否需要来自父母布局的信息
      • 我是否需要独立地动态调整多个元素的大小
      • 视图类型是预先确定的还是会改变?

      如果其中三分之二的答案是“是”,我将使用某种程度的程序化布局。如果没有,我将使用纯 XML。话虽如此,编程是鼓励独创性的职业之一(只要它是安全的),几乎任何事情都可以通过多种方式完成。归根结底,我想说做任何能让你的工作更轻松地制作高质量应用程序的事情。

      Google 根据自己对软件程序员的了解及其一般做法提出建议。他们还创建了平台,因此他们知道哪些东西以哪些方式进行了优化。一切都与经验有关,我们都有自己的经验。如果您在使用 XML 时遇到问题,那么值得花时间简单地找出其中的怪癖,以便它成为另一个可以使用的工具。此外,它还会为提供您自己回答此问题所需的信息。

      总结一下:我可以巧克力更好,但如果你喜欢香草,你会不同意。请注意每种方法的优缺点,并花时间学习如何使用这两种方法完成相同的任务。它会让你成为一个更好的程序员,让你更好地了解何时使用哪种技术。

      希望对你有帮助,

      模糊逻辑

      【讨论】:

      • 感谢您的撰写 - 我仍然对以编程方式创建视图有疑问,这不会占用更多堆内存,因为您需要在 java 代码中定义所有内容并因此等待 GC 运行以清理内存?在某些布局中,并非所有元素都是交互式的,因此无需为它们创建处理程序。如果您在代码上创建这些布局,则需要有处理程序。如果在 xml 上创建,则不需要处理程序。
      • 我碰巧没有那个答案。理论上,它在很大程度上取决于您的处理程序。事实上,即使是 XML 生成的布局也使用预渲染、渲染和后渲染处理程序,但这些大多是自动处理的。必须进行一些重要的测试才能得出任何结论。我能说的是,简单的处理程序有时性能更高,但这可能表明任何一种情况。
      【解决方案3】:

      我通常使用高度可定制的 UI 进行大量工作,其中大部分需要在代码中完成。话虽如此,我尽可能尝试使用布局片段并对其进行膨胀,因此在添加、删除或重新排列 UI 部分时,我仍然只是在做一些布局,而不是全部。

      话虽如此,通过代码进行布局并不难。它的最大优点是编译时检查。我会比使用预览窗格更快地找到问题。预览窗格可以很好地用于初始布局,但我使用层次结构查看器来找出我的布局看起来不正确的原因。

      【讨论】:

        【解决方案4】:

        最好把布局分开放在xml文件中。我偶尔需要在代码中调整布局,但这始终是一个例外,只有当我确定它无法在布局 .xml 中完成时。如果您正确使用布局视图,应用程序在所有设备上的外观应该非常相似。

        【讨论】:

          【解决方案5】:

          我在我编写的每个应用程序的几乎每个片段和活动上都使用 XML 布局。我很少看到任何需要动态创建视图,ListViews 的配置,显示/隐藏视图等需要在代码中进行。对我来说,XML 的优点是:

          • 能够使用布局编辑器 (Eclipse)
          • 更易于预览布局
          • 可能受益于布局的自动本地化
          • 为不同的设备(屏幕)轻松维护不同的并行布局
          • 通过查看可以了解布局(比代码更容易)
          • 易于将布局分解为多个部分(片段、包含等)以消除重复
          • 将视觉设计与其背后的功能区分开来

          我想不出任何充分的理由将我所有的布局都放入代码中——这听起来很糟糕。

          我认为您的布局看起来不一样的原因是您的 XML 没有正确定义布局。请记住,Android 工具会将 XML 布局转换为代码,因此使用 XML 布局与动态布局没有固有的问题 - 两者都以代码形式结束。

          【讨论】:

          • 谢谢奥利。您以 XML 为中心的方法使我深受鼓舞。部分原因是我拥有一个非常薄弱的​​开发系统并且无法使用并发模拟器。这是我使用代码而不是 XML 的主要原因之一,因为我可以确定我的布局在所有设备上看起来都一样。 Otoh,如果我使用 XML,我将不得不使用模拟器,以便我可以测试每个布局并实际检查 UI 的外观。
          • 另外,你有什么我可以参考的开源安卓项目吗?
          • 如果您查看 SDK 中的 Android 应用程序代码示例,或者查看 Mark Murphy (Commonsware) 书籍中的示例,您会看到大量使用 XML 的示例。我使用物理设备进行测试——其中少数为屏幕和操作系统类型提供了高覆盖率。我认为让慢速开发机器影响应用架构并不是一个好主意。
          • 堆内存怎么样?它不会导致堆内存吗?滚出屏幕或调用 onDestroy 事件后,它是否从堆内存中清除?
          猜你喜欢
          • 2016-01-02
          • 2016-06-04
          • 2013-07-27
          • 1970-01-01
          • 2014-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多