工具的交易
08 Feb 2015想象一个场景:你在Android Studio正在设计一个UI布局的某一个块,你的xml编辑器在你的面前,你还有一个美妙的布局方案。你在预览布局面板内看到的却是这个样子的:

哎呀!哥们,啥也不说了。
如果你在Android上开发过任何需要远程数据填充的布局,相信你经历过这种情况很多次了。 唯一能检测你的布局是否正确的方法,那就是运行到你的手机上。
如果这个时候你正在设计UI,当app运行时,意味着你还没有绑定任何数据到UI上,这需要你放置一些脏数据来显示。 所以你做了你从来都不应该做的事情:将一些脏数据硬编码到你的布局文件中去。
<TextView
android:id="@+id/text_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Title"
android:layout_margin="@dimen/main_margin"
android:text="I am a title" />
好吧,至少现在你在运行的时候可以看到什么了。结果如你所愿!“好,让我们继续添加一些数据放入代码中,我们后来还会回来把这些硬编码删掉。”-开发者说。
时间快速流逝到了下午六点。时间不早了,你的代码还仅仅能够运行,处在只是不会出现崩溃的边缘,你累的快要死,你的脑袋也变的混沌。这时你提交了代码和问题,在你没变成这样子之前:
第二天,来到办公司,打开github,你会看到:

奧!扯淡!
哪个家伙忘记把硬编码的脏数据去掉了。 这个数据会愉快的渗漏到我们最终版的apk中,这同样也是不好的。 这会导致今天某个人带着难看的样子站立五分钟。

哎呀!这个人曾在我身边出现。
不要成为一个工具,去使用工具
怎么才能避免,你问?足够简单:使用namespace工具和他的属性
从现在开始它将成为你最好的朋友:
xmlns:tools="http://schemas.android.com/tools"
设计期间的道具 这个你刚见到的新朋友是一位有魔力的朋友。它有令人吃惊的力量:它能够说服Android Studio 忽略常规Android:属性描述的内容,而且显示替换工具的属性。然而最令人难以置信的部分是,工具同时还可以说服打包工具或略自己的属性,最终我们的脏数据不会出现在实际的apk中。 这完美的满足了我们的需求。后面我们可以在布局文件中的根节点上加上声明xmlns:tools,接着修改下我们的TextView 如下:
<TextView
android:id="@+id/text_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Title"
android:layout_margin="@dimen/main_margin"
tools:text="I am a title" />
这个是可以安全的提交到我们的版本控制器中的,因为这对其他开发者非常有用,以后再也不用修改这个布局啦!(包括你自己——嘿,将来可能是我,不用谢!),因为它再也不会遗漏到apk中去。 在设计时,你可以使用任意的tool:属性来覆盖掉常规的android:属性。(例如,设置鲜明的背景色来擦看布局的边界)。
但是上面你所做的并不是namespace工具所有的!
利器

据已经知道的相关的内容,namespace工具非常有用,它会在很长的一个过程帮助你成为一个更好的xml布局开发者。在Android Tools website你可以找到一些关于这个工具的信息,但是在这儿我们会继续用全景透视的方式让你看到所有的属性都被解析的更详细。
除了在设计中会看到覆盖标准的属性外,在namespace中你还会看到一些用来奉献的tool:atrributes
不是所有的属性都一样
命名空间工具的属性主要可以分为的两大类。第一类包含的所有的属性是反映编译分析,然而第二类包括所有剩下的属性是用来考虑布局UI设计阶段例如IDE。
——————
Lint attributes
在tools命名空间中有三个Lint attributes:
- tools:ignore
- tools:targetApi
- tools:locale
ignore属性
这个ignore属性基本上等同于注解java的@SuppressWarnings,因为当一个或者多个警告出现在布局的节点中它告诉Lint去压抑或者忽略。
所以,假设我们有个drawable没有内容的ImageView(即:纯粹的视觉),声明如下:
编译器会将缺失的属性android:contentDescription高亮显示。但是由于没有内容描述对我们是好的,这时我们可以使用tools:ignore 来压制警告(如果你用的是严格编译规则,这样可以避免中断CI编译)。
targetApi属性
这个属性实际上所作的工作和java中的注释@TargetApi是一样的,即:告诉编译器这个资源需要运行在指定的最小API版本。这个基本上等同于你和编译器做了一个约定,但是这个约定编译器是不能反过来声明。
. . . .
