Android Studio XML 中的Tools属性

今天来讲讲 Tools 属性,这里主要说一下我们在写布局时,利用 Tools 属性带来的便利

初识 Tools

想必不管是在看一些开源项目,还是自己写布局时,或多或少接触到过如下命名空间

1
2
<RootTag xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >

xmlns:android 这个是默认的命名空间,而xmlns:tools 则是可有可无的,以前一直没去注意这个家伙到底有啥特别用途,只知道需要用到 tools: 属性时,就需要用到这个命名空间。

先来看一个 tools 的方便之处,我们在用 ListView 或者 RecyclerView 写布局时,一般都是等逻辑写好之后再运行去看效果,但是借助 tools:listitem 属性,我们可以直接在预览里头看效果

普通的布局文件

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />

</android.support.constraint.ConstraintLayout>

普通的预览效果

我们写一个自己的 item 布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="@dimen/dp10"
android:background="@color/colorAccent" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dp"
android:text="hello" />
</LinearLayout>

修改我们的普通的布局文件

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_demo" />

</android.support.constraint.ConstraintLayout>

再看效果

可以不用运行,就可以很便利的看到我们编写的效果。

还有一个好消息就是:tools 添加的属性,在构建项目的时候,会自动删除这些属性,对我们的 apk 大小没有任何影响。

一些 tools 属性

  • tools:ignore

    这个属性可以让编译器忽略掉一些不必要的警告

    1
    <string name="show_all_apps" tools:ignore="MissingTranslation">All</string>
  • tools:targetApi

    当你知道自己的布局肯定会运行在某一个版本之上时,可以用此属性来避免红色警告

    1
    2
    3
    <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:targetApi="14" >
  • tools:text

    我们知道如果对 TextView 设置了 android:text ,在运行到手机上时会默认存在,如果只是想要预览效果,设置这个属性将是最佳选择

    1
    2
    3
    4
    5
    6
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="10dp"
    tools:text="hello" />
  • tools:visibility

    这个在预览的时候作用就大了,我们经常需要去改动来看预览效果,而直接改 android:visibility 最后都会作用在真机上

    1
    2
    3
    4
    5
    6
    7
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="10dp"
    tools:visibility="visible"
    tools:text="hello" />
  • tools:itemCount

    这个在列表用处明显,不足之处就是不像通用属性那样自动识别,需要自己打出完整的属性名

    1
    2
    3
    4
    5
    <android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:itemCount="3"
    tools:listitem="@layout/item_demo" />

  • tools:keep

    这个主要用于打正式包时,一般我们打正式包都会对资源进行一些优化处理,此时一些没有被显式使用的资源将会被忽略,什么是显式呢,就是没有被布局文件直接引用或在代码直接引用的,而是通过Resources.getIdentifier() 方式来使用的资源文件。这样在运行 app 的时候就会存在问题,而用 keep 属性就能保留那些文件

    1
    2
    3
    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/used_1,@layout/used_2,@layout/*_3" />

以上只是列举了一些个人觉得可以常用到的一些属性,还有很多其他属性,也都是很好用的,具体可以去官网查看
https://developer.android.com/studio/write/tool-attributes