最佳实践:Android上的布局(编程式 vs XML)

35
这个问题困扰了我一段时间。我已经在Android平台上开发了几个应用程序,但总是不得不使用Java代码来构建布局。在专业的开发环境中,这样做可行吗?还是应该使用XML文件作为首选方法?我通常觉得XML的方法更繁琐,而且这些布局在所有设备上看起来都不一样。我真的不明白。从专业的角度来看,有人真的能够完全使用XML文件开发具有复杂视图的应用程序吗?这个问题困扰着我,因为谷歌推荐使用XML,但是除非通过编程的方式来完成,否则界面在所有设备上看起来都不一样。或者是我做错了什么吗?
请注意,我指的是Android 2.2和2.3,这是大多数用户使用的版本。
5个回答

36

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

  • 能够使用布局编辑器(Eclipse)
  • 更容易预览布局
  • 可以从布局自动本地化中受益
  • 轻松维护不同设备(屏幕)的不同并行布局
  • 通过查看布局就能了解其布局(比代码更容易)
  • 易于将布局拆分成片段(包括等),以消除重复
  • 保持视觉设计与后面的功能之间的分离

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

我认为您的布局看起来不同的原因是因为您的XML未正确定义布局。请记住,Android工具会将XML布局转换为代码,因此使用XML布局与使用动态布局没有固有的问题-两者最终都变成代码。


谢谢Ollie。你的XML中心方法让我非常受鼓舞。部分原因是我拥有一个相当薄弱的开发系统,无法使用并发仿真器。这是我使用代码而不是XML的主要原因之一,因为我可以确保我的布局在所有设备上看起来都一样。另一方面,如果我使用XML,我将不得不使用仿真器来测试每个布局,并实际检查UI的外观。 - OckhamsRazor
另外,你是否有任何开源的Android项目可以供我参考? - OckhamsRazor
如果您查看SDK中的Android应用程序代码示例,或者查看Mark Murphy(Commonsware)的书籍中的示例,您将看到大量使用XML的示例。我使用物理设备进行测试-其中一些设备可以提供对屏幕和操作系统类型的高覆盖率。我认为允许慢速开发机器影响您的应用程序架构不是一个好主意。 - Ollie C
堆内存怎么样?它不会导致堆内存问题吗?当滚动出屏幕或调用onDestroy事件时,它是否会从堆内存中清除? - Hossein Kurd

17

OckhamsRazor,

答案非常依赖于你的需求、灵活性和知识水平。首先要了解的是,每个布局,无论是通过XML还是编程方式创建的,都可以通过属性进行特定调整或使其符合多个屏幕。

... 并且总是不得不使用Java代码来构建布局。在专业的开发环境中,这样做是否可行呢?

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

... 是否有人能够纯粹地使用XML文件开发具有复杂视图的应用程序?

当然可以!有一些令人惊奇的程序完全利用了XML而不是编程视图。关键是需要从父View获取多少信息(即非标准视图属性)。即使在这些情况下,也有方法传递该信息,只要您知道在哪里以及如何做到这一点。

我有做错什么吗?

我不认为如此。老实说,我根据需要都运行这两种方式。应该真正取决于你对奇特之处的了解程度。以下是一个例子:有时我不知道所有元素需要多大,直到在设备上运行时;有时我会让设备符合我的布局需求。最终,我使用以下表格来做出决定。

  • 是否需要从父布局获取非视图属性信息?
  • 是否需要独立动态调整多个元素的大小?
  • 是否预先确定视图类型或是否也会更改?

如果其中三个问题的答案中有两个是“是”,我将使用一定程度的编程布局。否则,我将使用纯XML。话虽如此,编程是那些鼓励独创性(只要安全)并且任何事情都可以用任意数量的方式完成的职业之一。最终,我会说做任何让你更轻松地制作高质量应用程序的工作。

谷歌基于自己对软件程序员和他们的一般实践的了解进行建议。他们还创建了这个平台,所以他们知道哪些东西以哪种方式进行了优化。这完全是关于经验,我们每个人都有自己的经验。如果您在利用XML方面遇到困难,花时间弄清楚一下怪癖肯定是值得的,因为它是另一个工具。此外,这将为您提供自己回答这个问题所需的信息。

总而言之:我可能会说巧克力更好,但如果你喜欢香草味,你会不同意的。请注意每种方法的缺点和优点,并花时间学习如何使用这两种方法完成相同的任务。这将使您成为更好的程序员,并给您更好的使用哪种技术的感觉。

希望这可以帮到你,

FuzzicalLogic


感谢您的撰写 - 我仍然有一个问题,关于如何在程序中创建视图,这样做不会占用更多的堆内存吗?因为您需要在Java代码中定义所有内容,因此必须等待GC运行以清理内存。在某些布局中,并非所有元素都是交互式的,因此无需为它们创建处理程序。如果您在代码上创建这些布局,则需要处理程序。如果您在xml上创建它,则不需要处理程序。 - Simon
我恰好没有那个答案。理论上,这严重取决于你的处理程序。事实上,即使是XML生成的布局也使用预渲染、渲染和后渲染处理程序,但这些大多数情况下都是自动处理的。必须进行一些重要的测试才能得出任何结论。我可以说的是,简单的处理程序有时更具性能,但这可能是两种情况的指示。 - Fuzzical Logic

7

我通常会处理高度可定制的用户界面(UI),其中很大一部分需要用代码完成。但是,在任何可能的情况下,我都会尝试使用布局片段并将其填充,以便添加、删除或重新排列UI部分时,我仍然只需完成部分布局,而不是全部。

话虽如此,通过代码进行布局并不难。它的最大优势在于编译时检查。我可以比使用预览窗格更快地发现问题。预览窗格对于初始布局可能很好,但我使用层次结构查看器来找出我的布局为什么看起来不对。


4
这真的取决于项目或项目的某一部分类型以及您是什么类型的程序员。有些人只喜欢纯代码,而其他人则更喜欢尽可能多地依赖其他工具进行设计。
XML确实有一些好处,比如能够快速切换界面设计。对于重复的特定设计主题,对大多数程序员来说绝对是有用的。
我个人更喜欢通过编程完成所有任务,并且使用我创建的库和类比编写XML更快。 XML直接使用起来更快。
至于性能方面,除非您在同一时间反复使用相同的视图达到它不再适合屏幕的很多倍,否则真的没有值得一提的区别。我曾经测试过Android 4.4上Moto X可以渲染多少个文本视图,它无法超过5000个,但这从未有过任何目的。如果你到了那个地步,你要么需要动态加载和卸载数据,要么就是一开始做错了。
因此,学习两种方法,一定要了解您的编程风格的优缺点,因为并没有适合每个人的正确答案,放松心情,享受编程的乐趣。

0

将布局分离并放入xml文件中会更好。我偶尔需要在代码中调整布局,但这总是一个例外,只有当我确定无法在布局.xml中完成时才会这样做。如果正确使用布局视图,则应用程序在所有设备上看起来非常相似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接