Android开发之——Tools属性

一 前言

我们先看一张效果图片:协调布局ConstrainLayout中只有一个RecycleView,但是却显示出了数据列表。原因是什么呢?看完本文讲述的Android:Tools一些属性后,你就会明白

二 Android:Tools是啥?

  • 再讲Android Tools之前,先看下什么是命名空间

2.1 命名空间

2.1.1 定义

  • namespace即“命名空间”,也称“名称空间” 、”名字空间”。VS.NET中的各种语言使用的一种代码组织的形式 通过名称空间来分类,区别不同的代码功能 同时也是VS.NET中所有类的完全名称的一部分。百度百科

2.1.2 命名空间作用

  • 提供避免元素命名冲突的方法,里面存放的是特性属性的集合;
  • 如:android:text和tools:text代表两个不同的属性

2.1.3 命名空间分类

在Android中的命名空间可分为3种,如下:

  • android命名空间:xmlns:android="http://schemas.android.com/apk/res/android;
  • tools命名空间:xmlns:tools="http://schemas.android.com/tools;
  • 自定义命名空间:xmlns:app="http://schemas.android.com/apk/res-auto"

2.2 Android:Tools

Android Tools属性,能够在布局运行到手机前预览效果,不会污染真实请求后数据的显示。并且在构建应用程序时,构建工具会删除这些属性,这样就不会对APK大小或运行时行为产生影响。有三个主要功能:

  • 布局错误处理
  • 预览
  • 资源压缩

三 Tools功能详解

3.1 布局文件错误处理属性

3.1.1 tools:ignore

  • 作用:让Lint 工具在检查代码时忽略指定的错误。
  • 取值: tools:ignore="ContentDescription"
  • 示例:
    • 处理前:
    • 处理后:

3.1.2 tools:targetApi

  • 作用: 指明某个控件只在指定的API 及更高的版本中生效
  • 取值:API 版本号对应的 int值
  • 示例:RippleDrawable 水波纹(res\drawable\ripple_1.xml)
    • 处理前:
    • 处理后:

3.1.3 tools:locale

  • 作用: 指明 resources 中元素的语言类型
  • 示例
    1
    2
    <resources xmlns:tools="http://schemas.android.com/tools"
    tools:locale="zh">

3.2 视图预览相关属性

  • 以下属性在xml中定义之后,只在预览时会展示,正式部署之后并不会展示

3.2.1 用 tools:xxxx 替代 android:xxxx,只在预览时有效

  • 作用对象:View
  • 作用:将view的任意属性值的 android 前缀替换为 tools 之后,就可以实现预览效果
  • 取值范围:具体取值以view的属性取值为准
  • 示例:tools:text,tools:visibility等
    • 预览时:
    • 真实显示:

3.2.2 tools:context

  • 作用对象:layout
  • 作用:声明该布局文件默认关联的 activity、
  • 取值说明:与layout关联的activity的全路径
  • 示例:
    • tools:context
      1
      2
      3
      4
      <android.support.constraint.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context=".MainActivity" >
    • tools关联的点击提示

3.2.3 tools:itemCount

  • 作用对象:

  • 作用:在 节点中设置该属性之后,会指定在预览界面中绘制/展示几个条目

  • 取值说明:int 类型数值

  • 示例:

    • tools:itemCount

      1
      2
      3
      4
      5
      <android.support.v7.widget.RecyclerView
      android:id="@+id/recyclerView"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:itemCount="3"/>
    • 预览效果

3.2.4 tools:layout

  • 作用对象:

  • 作用:声明在预览时将哪个布局文件填充到该Fragment

  • 取值说明:布局id 的引用值

  • 示例:

    • tools:layout

        
      1
      2
      3
      4
      5
      6
      7
      8
      9
      <fragment
      android:id="@+id/fragment"
      android:layout_width="0dp"
      android:layout_height="0dp"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      tools:layout="@layout/layout_profile_list" />
    • 预览效果

3.2.5 tools:listitem 、 tools:listheader 、 tools:listfooter

  • 作用对象: 及其子类,如
  • 作用:在预览界面显示列表、表头、表尾
  • 取值说明:布局文件的引用
  • 示例:
    • tools:listitem 、tools:listheader 、tools:listfooter

        
      xmlns:android
      1
      2
      3
      4
      5
      6
      7
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@android:id/list"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:listitem="@layout/item_profile"
      tools:listheader="@layout/sample_list_header"
      tools:listfooter="@layout/sample_list_footer" />
    • 预览效果

3.2.6 tools:showIn

  • 作用对象:布局文件的根节点
  • 作用:声明该布局文件将会被哪个布局通过 引用。
  • 注意事项:声明之后,在对应的文件中不要忘了用 引用
  • 示例:
    • 声明:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      <TextView xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/ratingTextView"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:textColor="@color/colorPrimary"
      android:gravity="center"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      tools:showIn="@layout/activity_main"
      tools:text="Header" />
  • 引用(activity_main)

    1
    <include layout="@layout/sample_list_header"/>

3.2.7 tools:menu

  • 作用对象:布局文件的根节点、
  • 作用:声明在预览界面中 AppBar 将展示哪些菜单
  • 取值:直接填写res/menu/xxx的名字,不需要填写前缀: @menu/或者后缀.xml
  • 示例:
    • munu菜单(tools:menu下显示红色不知为何,但运行到手机里面时没有错误)

    • 预览布局

3.2.8 tools:minValue / tools:maxValue

  • 作用对象:

  • 作用:为NumberPicker 设置预览时的最小值和最大值

  • 取值:int 型数值

  • 示例

    • 代码

         
      1
      2
      3
      4
      5
      6
      7
      <NumberPicker xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/numberPicker"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      tools:minValue="1"
      tools:maxValue="10" />
    • 预览

3.2.9 tools:openDrawer

  • 作用对象:

  • 作用:在预览界面中将 DrawerLayout 打开

  • 取值:end、left、right、start

  • 注意事项:tools:openDrawer 的取值必须与侧拉窗口的 layout_gravity 的取值一致

  • 示例:

    • 代码

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      <android.support.v4.widget.DrawerLayout 		xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/drawer_layout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:openDrawer="start">

      <TextView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center"
      tools:background="@color/colorAccent"
      tools:text="主内容" />

      <TextView
      android:layout_width="50dp"
      android:layout_height="match_parent"
      android:layout_gravity="start"
      android:gravity="center"
      tools:background="#ff00ff"
      tools:text="侧拉" />

      </android.support.v4.widget.DrawerLayout>
    • 预览

3.2.10 "@tools:sample/*" resources

  • 作用对象:支持text文本或者image的view控件

  • 作用:为View设置占位文本或图片

  • 取值:

    属性值 占位符数据说明
    @tools:sample/full_names 随机组合生成的全名。@tools:sample/first_names@tools:sample/last_names.
    @tools:sample/first_names 普通的名字
    @tools:sample/last_names 普通姓氏
    @tools:sample/cities 来自世界各地的城市名称
    @tools:sample/us_zipcodes 随机生成的美国邮政编码
    @tools:sample/us_phones 随机生成的电话号码格式如下:(800) 555-xxxx.
    @tools:sample/lorem 从拉丁文派生的占位符文本
    @tools:sample/date/day_of_week 指定格式的随机日期和时间
    @tools:sample/date/ddmmyy 指定格式的随机日期和时间
    @tools:sample/date/mmddyy 指定格式的随机日期和时间
    @tools:sample/date/hhmm 指定格式的随机日期和时间
    @tools:sample/date/hhmmss 指定格式的随机日期和时间
    @tools:sample/avatars 可用作配置文件化身的矢量绘图
    @tools:sample/backgrounds/scenic 可用作背景的图像
  • 示例

    • 布局
      1
      2
      3
      4
      5
      6
      7
      8
      <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      android:gravity="center"
      tools:text="@tools:sample/full_names"
      tools:drawableLeft="@tools:sample/avatars"/>
    • 预览

3.3 资源压缩属性

  • 打包输出时,可以进行资源压缩,在 module 的build.gradle 文件作如下修改
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    android 
    {
    buildTypes
    {
    release {
    shrinkResources true
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
    }
    }
    }

3.3.1 tools:shrinkMode

  • 作用对象:
  • 作用:开启了资源压缩的构建工具
  • 取值:safe(安全模式)、strict(严格模式)
模式 说明
safe 保留被显示引用的,或者可能通过Resources.getIdentifier()被动态引用的资源
strict 保留 resources 或者 代码中 被显示引用的资源
  • 示例(在res/raw/keep.xml中配置tools:shrinkMode)

    1
    <?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools"    tools:shrinkMode="strict" />

3.3.2 tools:keep

  • 作用对象:

  • 作用:使用资源压缩去移除未被使用的资源时,该属性将允许你指明哪些资源可以被保留

  • 示例(res/raw/keep.xml)

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

3.3.3 tools:discard

  • 作用对象:

  • 作用:当使用资源收缩删除未使用的资源时,此属性允许您指定要手动丢弃的资源

  • 示例(res/raw/keep.xml)

    1
    2
    3
    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"
    tools:discard="@layout/unused_1" />

四 参考

Android总结:命名空间
Tools attributes reference
Android:Tools命名空间原来是有大用处的
Android 冷兵器 之 tools
是时候让 Android Tools 属性拯救你了