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

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

在上篇文章中我们了解到tools命名空间可以被用来只在写xml布局文件期间覆盖任何attribute,也可以帮助我们更好地使用Lint。当然,tools attributes还有其他为我们所做的。


UI attributes

tools命名空间剩下的所有8个attributes都是和IDE的UI预览面板有关,所以称之为UI attributes。

这些UI attributes在你使用IDE写layout文件时会让一些工作更加简单方便。这些attributes包括:

  • tools:context
  • tools:menu
  • tools:actionBarNavMode
  • tools:listitem/listheader/listfooter
  • tools:showIn
  • tools:layout

The context attribute

context attribute是用来告诉IDE你的layout文件是由哪个Context所解析。这样预览面板自动选择相应的主题,此外在AS中,在类文件中打开Go to Related files选项更准确得索引到layout文件。

attribute的值为包含包名的Activity,写在layout的根节点中:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/container"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      tools:context="com.android.example.MainActivity">
      <!-- ... -->
</LinearLayout>

The menu attribute

menu attribute用来告诉IDE预览面板中显示哪个menu。同样的,写在layout的根节点中。

如果你使用了刚刚介绍的context attribute声明了对应的activity,那IDE就会在onCreateOptionsMenu尝试检查出你所使用的menu文件,然后显示在预览面板上。但我们若使用了menu attribute的话,预览面板就会显示我们所声明的menu。

在这个attribute中你可以定义一个或多个menu的XML文件,只需要写menu的文件名即可,以逗号隔开,形如:

tools:menu="menu_main,menu_edit"

要不显示menu,只要把值设空:

tools:menu=""

还有一点需要注意的是,当你设置的主题基于Theme.AppCompat时,以上attribute就不起作用了- -。

The actionBarNavMode attribute

这个attribute用来确定预览面板中Action Bar应该显示何种的导航模式。有以下3种:

  • standard
  • tabs
  • list

ps:这个attribute在你使用基于Theme.AppCompat或Theme.Material的主题时、或你在layout中有使用Toolbar控件的时候是不起作用的。只有app是基于holo风格的主题才会有效。

The listitem, listheader and listfooter attributes

当在layout文件中有基于AbsListView的控件时,预览面板一般都只会显示常规的预览图。使用了listitem、listheader和listfooter attributes的话,你可以指定选择预览面板中显示list items、header和footer的layout文件。

<ListView
     android:id="@+id/list"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     tools:listheader="@layout/list_header"
     tools:listitem="@layout/list_item"
     tools:listfooter="@layout/list_footer" />

但是这里请注意,GridView只有listitem attribute有效果。

当然,RecyclerView使用以上的attribute也是没用的,它都不继承自AbsListView啊……

The layout attribute

这个attribute用来告诉预览面板在运行时哪个layout文件会被解析到一个fragment(在onCreateView()中)。它与你使用include标签的layout attribute相类似。

The showIn attribute

这个attribute适用于你使用include标签的layout attribute所指定的layout文件是以merge标签为根节点的情况。(介绍太长不翻了。。)

<merge 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:showIn="@layout/activity_main">

小结

tools命名空间的使用为的是提高我们的开发效率,很多的工作都可以通过IDE帮我们来完成,何乐而不为呢?

引用博主的最后一句话:

Don’t be a tool, use the tools.