[译]精通 Android 中的 tools 命名空间

原文:http://blog.alexsimo.com/mastering-tools-namespace-android/

作者Alexandru Simonescu ( blog.alexsimo.com )

译文:http://www.jianshu.com/p/a39dddb46bd8

译者:lovexiaov ( lovexiaov.cn )


今天推荐给各位的是lovexiaov同学的译文,这篇文章讲述的虽是一个技术小细节,但若能掌握好它,对我们日常开发的效率提升是很有帮助的,我个人平时也没太注意文中提到的一些地方,看完感觉对我还是有帮助的,因此也推荐给大家。


值得一提的是,lovexiaov的原文译文是同步附带英文原文的,主要是担心有错漏以方便大家校正,这种严谨的态度值得肯定,但我校对过后认为译文没有太大问题,考虑在手机上的阅读效果,经他同意移除了英文原文部分,便于大家流畅阅读。

你可能注意到了 tools 命名空间会出现在许多 Google 提供的样例布局 XML 文件中。此命名空间在开发阶段很有用,而且不会影响用户体验。它包含了一套方便的属性,帮助我们在 Android Studio 设计视图中渲染布局。

有时这些巧妙 ( tricky )的属性会节约我们的构建时间。我并不是说会加快构建速度,而是界面修改相关的构建会减少。


tools 命名空间的 URI 是 http://schemas.android.com/tools,通常使用 tools 前缀绑定,但你也可以使用任何其他前缀。

该命名空间中的所有属性都不会影响运行时或 apk 的大小,它们会在 Gradle 打包应用时被剥离出去。

你可以使用 Android Studio 提供的快捷键快速添加 tools 命名空间。只需输入 toolsNS 然后按下 TAB 键。


值得一提的是,截止到写这篇文章时,Android Studio 并没有太多对此 xml 语法补全支持,不过别担心,即使 AS 没有语法提示,你仍然可以覆写 tools 属性。最简单的使用方式是:首先书写基于 android: 命名空间的属性,然后使用 CMD + D 复制这行,并替换它的前缀(为 tools)。


开始使用

当我刚做 Android 开发时,曾使用 android:text=”” 属性结合一些硬编码的假文本在 预览窗口 中查看 TextView 或 EditText 如何显示。但是 Lint 工具会检查出硬编码字符串的问题,最后我只能去定义 strings(来消除此问题),然而这样做对用户没有任何意义,还使我的 .apk 中包含了没用的资源。

(解决上述问题的)技巧是使用 tools:text”@string” 来在预览窗口中查看预填充了数据的View。你会得到类似如下的 xml 代码:


使用以上代码片段,在设计时你会看到 TextView 中的文字,而在运行时将不会有该属性存在。

运行时和设计时的不同属性

需要注意的是你可以同时使用 android 和 tools 命名空间。tools 命名空间将会用在设计阶段,而前者会用在运行时。

有时你希望在运行时开启某些特性,而在设计预览时关闭它。Android 文档展示了 ListView 的例子:


这里你可以看到:在运行时开启了 fastScrollAlwaysVisible 功能,而在设计时关闭了它。

其实你可以覆盖所有已存在于 android 命名空间中的属性,但无法覆盖自定义属性。

在 XML 中设置 Target API

你可以在 XML 中设置 Target API,就像在 Java 中使用 @TargetApi 一样。API 版本可以通过一个整型或它的代号指定。这将避免 Lint 报特定版本 XML 属性的问题。


由于 Android Studio / Lint 默认语言是英语,如果你有其他语言的字符串资源,它将会显示如下的排版警告。


告知 Lint 你本地化资源的技巧:


这样就不会显示排版警告了。

预览 fragment 和自定义View的布局

我发现这(tools 命名空间)在使用 Fragment 和自定义View时非常有用。通过 tools:layout=”@layout/your_layout” 属性你可以设置在预览窗口中显示一个布局。


上述代码使用了 tools:layout 属性来预览 BooksFragment 布局,而不用将工程运行在设备或模拟器上。

我们来看一下View结构:

activity_main:


fragment_book:


fragment_book_list_item:


打开 activity_main 的预览窗口,你将会看到如下界面:


预览列表项布局

如果你比较细心,你会看到上面 xml 代码片段中的 tools:listitem=”” 一行。这在预览列表时会显示你自定义的列表项而不是默认的 @android:layout/list_content”。

还有更多相关的属性,但是 RecyclerView 没有 header 或 footer 属性(这两个属性只能用在 ListView 上)。这两个属性分别是 tools:listheader 和 tools:listfooter。

带父容器上下文的View

假如你有一个自定义View,或可重用的布局会通过标签被用在许多地方。当设计该View时,在想要包含它的父容器中预览它会如何显示,将会很有帮助。

在上面的 fragment_book_list_item 中,如果我们添加 tools:showIn=”@layout/activity_main” 属性,将可以预览该列表条目如何显示在 activity_main 中。这没有多大意义,只是为了演示这个概念。


预览界面将类似于这样:


该特性也依赖于 Android Studio 的版本。截止写此文时,我使用的是 Android Studio v2.1。

关联 XML 到一个 activity 上

我很确定你已经知道该属性了,当我们使用 Android Studio 引导创建一个 Activity 时,在默认生成的 XML 文件中你会找到该属性 tools:context=”.MainActivity”。如你所知,单个 xml 布局可以被用在多个 Activity 或 Fragment 中,使用此属性,你就告诉了 Android Studio 哪个 .java Activity 类与之相关联。

这将帮助布局修改者猜测 Activity 的主题,因为主题曾被定义在 AndroidManifest.xml 文件中。

忽略 Lint 警告

你应该谨慎使用此属性,因为忽略 Lint 警告不是一个好主意。如果 Lint 上报问题,你应该行动起来并修复错误和警告。但有时 Lint 给出的是错误警告,我们明确知道(或许不知道)我们在做什么。这种情况下你可以使用 tools:ignore=””。

想象一下我们有一个图标找不到它对应的像素密度文件夹,我们可能会使用 tools:ignore=”IconMissingDensityFolder” 忽略 Lint 警告。你可以在 Android 官方文档 中阅读更多关于 Lint 的内容。

预览带菜单的布局

默认情况下,定义在 Activity.onCreateOptionsMenu() 中的菜单会被渲染到预览窗口。但你可以使用 tools:menu=”comma separated menu IDs” 覆盖此菜单。我个人不会使用该属性,但它可能会对你有用。

设置 Toolbar 导航模式

此属性很简单!使用 tools:actionBarNavMode=”standard|list|tabs” 你可以设置 ActivityBar 的导航模式。

缩减资源

Android tools 命名空间中有许多关于缩减资源的属性,比如 tools:shrinkMode=”strict|safe”,tools:keep=”@layout|layout_wildcard”,tools:discard=”@layout/unused” 等,但我不准备在此讨论它们,因为本文不是讨论缩减资源的,如果你感兴趣,可以在 Android Studio 官方文档中了解更多信息。

References:

  • http://tools.android.com/tips/layout-designtime-attributesAndroid Stu

  • http://tools.android.com/tech-docs/tools-attributes

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值