7.3.4 Layout控件

Layout控件是一种容器控件,它们派生自android.view.ViewGroup,其本身并不包含任何内容,也不需要与用户进行交互,唯一的任务是按照一定的样式排列其中的子控件。

如表7-1所示,Android提供的Layout控件主要包括线性容器控件(LinearLayout)、表格容器控件(TableLayout)、帧容器控件(FrameLayout)、关系容器控件(RelativeLayout)等几种。每种控件都有其各自不同的特点,开发者可以根据界面特征进行选择。

7.3.4 Layout控件 - 图1

俗话说“条条大路通罗马”,在Layout控件的使用上也是如此,同样的一个界面,可以通过不同的Layout控件组合来进行构造。如图7-12的这个简单界面,可以通过线性容器控件(7-12a)、表格容器控件(7-12b)、关系容器控件(7-12c)进行构造。不同容器控件的构造和实现方法有所不同,这就决定了它们的一些特征有所区别:

1)开发成本。使用各个容器控件描述界面的复杂度是不一样的。相比之下,线性容器控件最容易开发,描述的代码也最精简;而关系容器控件的使用就稍显复杂,需要付出的开发和调试成本都会更多一些。对于界面而言,开发成本往往并不是一次性的付出,因为界面总是需要不断变更的,这就意味着开发成本高的容器控件,在应对不断的变化时,也需要付出更高的开销。

2)表达能力。尺有所短,寸有所长。开发成本较低的容器控件,其表达往往就会稍显欠缺。比如,一个线性容器控件只能用于描述一个方向上连续排列的控件,而关系容器控件则几乎可以用于描述任意复杂的交互界面。

3)性能。表达能力越强的容器控件,性能往往会略低一些,因为系统需要将更多的时间花在计算子控件的位置上。

4)版本兼容性。Android的版本变更非常快,不同的版本中Layout容器控件的呈现会有所不同。据我个人的实践经验,关系容器控件的兼容性最差,在不同版本中的表现也大相径庭,尤其在基准控件的可见性发生变化时;而线性容器控件等Layout控件的兼容性要略好一些。

7.3.4 Layout控件 - 图2

图 7-12 通过不同的Layout控件来构造界面

在实际开发中,需要秉承不“过度设计”的原则,有道是“由俭入奢易,由奢入俭难”。开发者应尽量优先使用开发成本低的容器控件去描述界面,随着界面逐渐变得复杂,再尝试使用表达能力强的控件进行重构。

此外,对于同一界面而言,开发者还需要考虑是使用尽量少的、表达能力强的Layout控件来表达,还是选用多个、表达能力稍弱的Layout控件组合来展示。使用多个Layout控件来展示界面,可以使得代码结构更清晰,维护成本更低;但如果使用的Layout控件过多,会增加整个控件树的层级,从而导致很多相关操作的性能有所降低。开发者需要从实际出发,寻求性能和可维护性之间的平衡。