Android Tools Attributes,让布局设计所见即所得

KamiStarke 8年前
   <p>开发人员在设计Android Layout布局时,总会伴随着一些乱七八槽的困扰。比如,为了更加逼真的真实数据预览效果,我们在开发时会将TextView的text属性写上一些假数据,而当运行到模拟器或真机上时这些假数据就成了造成体验上甚至测试BUG的脏数据,又需要一一清除。再比如,我们想在XML的预览界面上就看到ListView的Item内容,而不是只有通过编译运行时才能查看。等等,诸如这些存在于开发Layout内容阶段的困扰,都可以通过Tools Attributes得以解决,不妨了解一下。</p>    <h2><strong>xmlns 定义</strong></h2>    <p>Android提供了一种特殊的tools命名空间,来帮助开发人员在开发Layout布局时使用tools属性解决实时预览等问题。这种属性在应用打包运行时将会被忽略,不产生任何影响。tools命名空间的URI为: http://schemas.android.com/tools ,通常可将其定义在Layout的根容器中(在Android Studio中,可利用Live Temples快捷方式,输入toolsNs即可对应提示),如:</p>    <pre>  <code class="language-xml"><?xml version="1.0" encoding="utf-8"?>  <RelativeLayout 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">    </RelativeLayout>  </code></pre>    <p>这里将Tools Attributes按照功能分为两种类别,一种是去除Lint提示的,一种是展示布局预览的,下面一一介绍相关属性的使用。</p>    <h2><strong>Lint 提示</strong></h2>    <p><strong>tools:ignore</strong></p>    <p>这个属性用于告诉 Android Lint 忽视某些xml警告,比如平时使用ImageView的时候都要加上这么一句: android:contentDescription="@null" ,否则便会出现黄色警告:[Accessibility] Missing contentDescription attribute on image,此时就可以使用 tools:ignore 属性忽视这个警告:</p>    <pre>  <code class="language-xml"><ImageView   android:layout_width="match_parent"   android:layout_height="match_parent"   tools:ignore="contentDescription"/>  </code></pre>    <p><strong>tools:targetApi</strong></p>    <p>类似Java代码中的 @TargetApi 注解一样,指定API级别,可以使用数字level,也可以直接用API name,比如elevation属性只能在API 21及更高版本使用,使用 tools:targetApi 属性可以忽视版本的警告:</p>    <pre>  <code class="language-xml"><ImageView   android:layout_width="wrap_content"   android:layout_height="wrap_content"   tools:targetApi="LOLLIPOP"/>  </code></pre>    <p><strong>tools:locale</strong></p>    <p>指定IDE当前的假定本地语言,可用在资源文件的根元素上,比如用在 values/strings.xml 上,避免一些拼写语法上的检查:</p>    <pre>  <code class="language-xml"><resources xmlns:tools="http://schemas.android.com/tools"   tools:local="es">            <!-- string -->      <string name="name">nombre</string>        </resources>  </code></pre>    <h2><strong>布局预览</strong></h2>    <p>这里也分为两种,一种是替换标准的android命名空间的控件固有属性,举个例子:</p>    <pre>  <code class="language-xml"><TextView   xmlns:tools="http://schemas.android.com/tools"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   tools:text="Samples"/>  </code></pre>    <p>上例中使用tools:text替换了android:text标准属性,在design窗口预览时可以看到TextView的text内容,而运行时则会被忽略。诸如此类,其他android标准属性均可被替换以达到预览效果。另一种就是非android标准属性了,下面一一说明。</p>    <p><strong>tools:context</strong></p>    <p>这个属性用在layout文件的根元素上,指明与当前layout相关联的Activity,从而在预览时使用Activity的主题(theme一般定义在Manifest文件中并且与activities联系在一起,而非layout)。可以使用Activity的全名,也可以利用manifest中定义的包名作为前缀:</p>    <pre>  <code class="language-xml"><?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:tools="http://schemas.android.com/tools"   tools:context=".MainActivity"   android:layout_width="match_parent"   android:layout_height="match_parent">    </RelativeLayout>  </code></pre>    <p><strong>tools:layout</strong></p>    <p>这个属性主要用于 标签中,指定预览时用的layout布局文件内容:</p>    <pre>  <code class="language-xml"><fragment   android:layout_width="match_parent"   android:layout_height="match_parent"   tools:layout="@layout/fragment_content"/>  </code></pre>    <p><strong>tools:listitem/listheader/listfooter</strong></p>    <p>顾名思义,这三个属性可用于诸如ListView、GridView、ExpandableListView等AdapterView的子类中,实现内容布局的预览。注意:经实践,在Android Studio中已经无法达到这些元素的内容预览效果,但 tools:listitem 属性可以用在 RecyclerView 中,比如:</p>    <pre>  <code class="language-xml"><android.support.v7.widget.RecyclerView   android:layout_width="match_parent"   android:layout_height="match_parent"   tools:listitem="@android:layout/simple_list_item_checked"/>  </code></pre>    <p>RecyclerView使用tools:listitem的前后对比预览效果如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/54866e70c2cd765562e9f2f2722c5285.png"></p>    <p><strong>tools:showIn</strong></p>    <p>这个属性用在 标签所包含的layout的根元素上,指定一个 所在的布局文件,这样在被嵌套的layout的design视图中便可以预览到外层的layout内容。比如在activity_main.xml中使用 <include> 标签嵌套一个include_content.xml文件,那么在include_content.xml文件的根元素中就可以使用 tools:showIn 属性指定Outer layout,达到在include_content.xml文件中预览activity_main.xml内容的效果:</p>    <pre>  <code class="language-xml"><?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:tools="http://schemas.android.com/tools"   tools:showIn="@layout/activity_main"   android:layout_width="match_parent"   android:layout_height="match_parent">    </RelativeLayout>  </code></pre>    <p>tools:menu</p>    <p>这个属性用在layout根元素中,指定layout预览时ActionBar展示的menu内容。使用 tools:context 属性时,ActionBar会自动查找Activity中的 onCreateOptionsMenu() 方法预览menu, tools:menu 属性的设置会覆盖 tools:context 属性的效果。 tools:menu 的值只需要使用menu文件的名字即可,多个menu使用逗号隔开,如</p>    <pre>  <code class="language-xml"><?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:tools="http://schemas.android.com/tools"   tools:menu="menu1,menu2"   android:layout_width="match_parent"   android:layout_height="match_parent">    </RelativeLayout>  </code></pre>    <p><strong>tools:actionBarNavMode</strong></p>    <p>这个属性用在layout根元素中,指定layout预览时ActonBar的导航模式,值有standard、list和tabs三种,如:</p>    <pre>  <code class="language-xml"><?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:tools="http://schemas.android.com/tools"   tools:actionBarNavMode="standard"   android:layout_width="match_parent"   android:layout_height="match_parent">    </RelativeLayout>  </code></pre>    <p>ActionBar不同navigation mode下的预览效果如图所示,关于navigation mode的相关信息可参考 <a href="/misc/goto?guid=4959720656306289277" rel="nofollow,noindex">Top Level Switching With View Controls</a> :</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c8033e2ff9cdb0eb4b6d725baeccc317.png"></p>    <p><strong>tools:shrinkMode/keep/discard</strong></p>    <p>为了使APK文件尽可能地变小,一般在打包发布时会开启Shrink Code和Shrink Resources的功能,删除项目中无用的代码和资源,使用这三个属性可以指定某些resources的保留与删除。</p>    <p> </p>    <p>来自:http://yifeng.studio/2016/10/13/android-tools-attributes/</p>    <p> </p>