Android中tools命名空间使用详解(1)

想必android开发的小伙伴在布局文件中经常会看到

xmlns:tools="http://schemas.android.com/tools"

但是实际开发过程中我们却很少用到tools中的东西。

最近读了国外写的关于tools命名空间的博文,觉得很有必要写一篇中文版的。英文好的小伙伴直接去看原文吧~

原文链接:https://medium.com/sebs-top-tips/tools-of-the-trade-part-1-f3c1c73de898


在写android的layout文件时,我们经常会遇到这样一种情况:布局里有好多TextView,但是又想在IDE中看到预览效果,怎么办?通常我们都会这样写:

<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" />

直接在TextView中写上假数据看效果,但是很有可能写完布局文件你就忘了删了。导致的结果就是上线的app很有可能让用户看到你写的假数据不知所云。如何解决?so easy:

<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" />

只要改成上面这样,你既可以看到布局的预览图效果,也不会影响最终的app。当然记得在布局文件的根标签加上

xmlns:tools="http://schemas.android.com/tools"

tools attributes其实可以被分为两类。第一类包含了所有的attributes,会影响到Lint analysis;第二类包含了其他的一些attributes,会影响使用IDE编写XML的时候。

Lint attributes

在tools命名空间中有3种Lint attributes:

  • tools:ignore

  • tools:targetApi

  • tools:locale

The ignore attribute

这个ignore attribute基本等同于Java中的@SuppressWarnings注解,告诉Lint忽略某方面的警告信息。比如我们有个ImageView没有设置android:contentDescription,在XML中Lint就会有警告信息。我们可以加上ignore attribute来去除Lint的警告:

<ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginStart="@dimen/margin_main"
      android:layout_marginTop="@dimen/margin_main"
      android:scaleType="center"
      android:src="@drawable/divider"
      tools:ignore="contentDescription" />

The targetApi attribute

这个attribute等同于Java中的@TargetApi注解,用来告诉Lint你在XML
中使用的某一控件的最低API版本(这句直接从英文翻译过来,感觉解释不清楚)。举例子,你在drawable文件夹(未标记为-v21)下的一个layout文件中写了5.0才有的ripple控件:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/accent_color" />

这样写在通用的drawable下Lint肯定会报警告信息,如果你确定已经在API20以下的版本时会使用其他的layout,那你可以使用targetApi attribute消除Lint警告:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:color="@color/accent_color"
  tools:targetApi="LOLLIPOP" />

The locale attribute

最后一个attribute是用来标明一个resource是针对某一地区的。这个属性在tools命名空间里用的很少。如果你的应用只针对说意大利语地区的人,那你在res/values/strings.xml可以这么写:

<resources
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  tools:locale="it">

  <!-- Your strings go here -->

</resources>

这样Android Studio就知道你的app语言不是以英语为主,而且在strings.xml中不会进行spell check。