你可能注意到了 tools 命名空间会出现在许多 Google 提供的样例布局 XML 文件中。此命名空间在开发阶段很有用而且不会影响用户体验。它包含了帮助我们在 Android Studio 设计视图中渲染布局的一套方便的属性。
有时这些巧妙的属性会节约我们的构建时间。我并不是说会加快构建速度,而是构建相关的 UI 改变会减少。
1 2 3 4 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"/> |
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"
来在预览窗口中查看预填充了数据的视图。你会得到类似如下的 xml 代码:
1 2 3 4 5 |
<TextView tools:text="Mastering ToolsNs" android:layout_width="wrap_content" android:layout_height="wrap_content" /> |
使用以上代码片段,在设计时你会看到 TextView
中的文字,而在运行时将不会有该属性存在。
运行时和设计时的不同属性
需要注意的是你可以同时使用 android
和 tools
命名空间。tools
命名空间将会用在设计阶段而前者会用在运行时。
有时你希望在运行时开启某些特性在设计预览时关闭。Android 文档展示了 ListView
的例子:
1 2 3 4 5 6 |
<ListView android:id="@+id/listView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fastScrollAlwaysVisible="true" tools:fastScrollAlwaysVisible=""/> |
这里你可以看到:在运行时开启了 fastScrollAlwaysVisible
功能,而在设计时关闭了它。
其实你可以覆盖所有已存在与 android
命名空间中的属性,但无法覆盖自定义属性。
在XML 中指定目标 API 版本
你可以在 XML 中执行 API 级别,就想在 Java 中使用 @TargetApi
一样。API 版本可以通过一个整形或它的代号指定。这将避免 Lint 上报版本特定 XML 属性的问题。
1 2 3 4 5 6 7 |
<TextView tools:text="Mastering ToolsNs" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:layout_height="match_parent" tools:targetApi="M" /> |
告知 Lint 你的字符串是正确的
由于 Android Studio / Lint 默认语言是英语,如果你有其他语言的字符串资源,它将会显示如下的排版警告。
告知 Lint 你本地化资源的技巧:
1 2 |
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es"/> |
这样就不会显示排版警告了。
在 fragment 和自定义视图上预览布局
我发现这(tools 命名空间)在使用 Fragment
和自定义视图时非常有用。通过 tools:layout="@layout/your_layout"
属性你可以设置在预览窗口中显示一个布局。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <fragment android:name="com.alexsimo.mastertoolsnamespace.BooksFragment" android:layout_width="match_parent" android:layout_height="wrap_content" tools:rong>你可能注意到了 tools 命名空间会出现在许多 Google 提供的样例布局 XML 文件中。此命名空间在开发阶段很有用而且不会影响用户体验。它包含了帮助我们在 Android Studio 设计视图中渲染布局的一套方便的属性。
有时这些巧妙的属性会节约我们的构建时间。我并不是说会加快构建速度,而是构建相关的 UI 改变会减少。
tools 命名空间的 URI 是 该命名空间中的所有属性都不会影响运行时或 apk 的大小,它们会在 Gradle 打包应用时被剥离出去。 你可以使用 Android Studio 提供的快捷键快速添加 tools 命名空间。只需输入 值得一提的是截止到写这篇文章时,Android Studio 并没有太多对此 xml 语法补全支持,不过别担心,即使 AS 没有语法提示,你仍然可以覆写 开始使用当我刚做 Android 开发时,曾使用 (解决上述问题的)技巧是使用
使用以上代码片段,在设计时你会看到 运行时和设计时的不同属性需要注意的是你可以同时使用 有时你希望在运行时开启某些特性在设计预览时关闭。Android 文档展示了
这里你可以看到:在运行时开启了 其实你可以覆盖所有已存在与 在XML 中指定目标 API 版本你可以在 XML 中执行 API 级别,就想在 Java 中使用
告知 Lint 你的字符串是正确的由于 Android Studio / Lint 默认语言是英语,如果你有其他语言的字符串资源,它将会显示如下的排版警告。 告知 Lint 你本地化资源的技巧:
这样就不会显示排版警告了。 在 fragment 和自定义视图上预览布局我发现这(tools 命名空间)在使用
|