Android - Designtime Layout Attributes & Tools Attributes

Designtime Layout Attributes

As of Android Studio 0.2.11, the layout rendering (used in both the layout editor as well as the XML editor layout preview window), supports  designtime layout attributes.

These are attributes which are used when the layout is rendered in the tool, but have no impact on the runtime. This is useful if you for example want to put  sample data in your textfields for when you are editing the layout, but you don't want those attributes to affect your running app.

To use designtime attributes, first make sure you have the tools namespace defined in your layout:

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        ...

The tools namespace is a specially recognized namespace by the Android tools, so all the attributes you define on view elements in the tools-namespace will be automatically stripped when the application is packaged and there is no runtime overhead.

Then, to for example set the text of a text field, use the same attribute as you would from the Android framework, but use the  tools: namespace rather than the  android: namespace:

        <TextView 
            android:text="Name:"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <EditText 
             tools:text="John Doe"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

In the above, the Name label is using the normal text attribute, and will be shown at runtime. However, the text field is using a designtime attribute, so it will appear in the tool, but not at runtime. 

In general, you can set any Android framework attribute as a designtime attribute; just   use the   tools:   namespace rather than the   android:   namespace. Note also that you don't have to choose either/or; you can set both the Android namespace attribute (which will be used at runtime) and a tools attribute (which will override the runtime attribute at designtime only).

You can also use designtime attributes to unset an attribute while in the tools. For example, there is a bug ( http://b.android.com/58448)  that you cannot use the  fastScrollAlwaysVisible attribute on ListViews in the layout editor. However, you may still want that attribute set at runtime. With designtime attributes you can work around it like this:
    <ListView
        android:id="@+id/listView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fastScrollAlwaysVisible="true"
        tools:fastScrollAlwaysVisible=""/>

Here's another example; we have a FrameLayout with multiple children, and at designtime we only want to see one of them, let's say the second child: We can use the tools:visibility attribute:

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="First"
        tools:visibility="invisible" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second"
        tools:visibility="visible" />

(Instead of visibility="invisible" you may want to use visibility="gone", depending on your needs.)

Limitations

  • Currently only overriding existing attributes is supported. We may want to define some additional convenience attributes to make it simple to for example choose which child in a ViewFlipper to show etc.
  • You have to manually edit in your designtime attributes at this time
    • They do not appear as an option in for example the layout editor property sheet. 
    • Editor code completion does not help you enter these attributes; the easiest way to use them is to first enter them in the Android namespace, and when done replacing the prefix.
  • Note that designtime attributes are supported only for layout files themselves. You cannot use them anywhere else -- in menu XML files, in string resource definitions, etc.
  • Designtime attributes can only be used for framework resources, not custom attributes at this point.
  • See https://code.google.com/p/android/issues/detail?id=46186 for background or additional requests or comments

Tools Attributes

Android has a dedicated XML namespace intended for tools to be able to record information in XML files, and have that information stripped when the application is packaged such that there is no runtime or download size penalty.  The namespace URI is http://schemas.android.com/tools  and is usually bound to the  tools:  prefix:

<FrameLayout 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" >
    ....

This document records our current uses of tools attributes. ( NOTE: These may change over time.)

tools:ignore

This attribute can be set on any XML element, and is a comma separated list of lint issue ID's that should be ignored on this element or any of its children, recursively.
<string name="show_all_apps" tools:ignore="MissingTranslation">All</string>

Used by: Lint

tools:targetApi

This attribute is like the @TargetApi annotation in Java classes: it lets you specify an API level, either as an integer or as code name, that this element is known to be running on.

    <GridLayout  tools:targetApi="ICE_CREAM_SANDWICH" >

Used by: Lint

tools:locale

This attribute can be set on the root element in a resource value file and should correspond to a language and optionally a region. This will let tools know what language (locale) the strings in the file are assumed to be. For example, values/strings.xml can have this root element:

<resources xmlns:tools="http://schemas.android.com/tools"  tools:locale="es" >
Now we know that the language used for strings in the default values folder is Spanish rather than English.

Used by: Lint, Studio (to disable spell checking in non-English resource files)

tools:context

This attribute is typically set on the root element in a layout XML file, and records which activity the layout is associated with (at designtime, since obviously a layout can be used by more than one layout). This will for example be used by the layout editor to guess a default theme, since themes are defined in the Manifest and are associated with activities, not layouts. You can use the same dot prefix as in manifests to just specify the activity class without the full application package name as a prefix.
<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"
     tools:context=".MainActivity"  ... >

Used by: Layout editors in Studio & Eclipse, Lint

tools:layout

This attribute is typically set in a <fragment> tag and is used to record which layout you want to see rendered at designtime (at runtime, this will be determined by the actions of the fragment class listed by the tag).
<fragment  android:name="com.example.master.ItemListFragment" tools:layout="@android:layout/list_content" />

Used by: Layout editors in Studio & Eclipse

tools:listitem / listheader / listfooter

These attributes can be used on a <ListView> (or other AdapterView children like <GridView>, <ExpandableListView> etc) to specify layouts to use for the list items, as well as list headers and list footers, at designtime. The tool will fill in dummy data to show a list with some representative contents.
    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem="@android:layout/simple_list_item_2" />

Used by: Layout editors in Studio & Eclipse

tools:showIn

Attribute set on the root element of a layout that <include>'ed by another layout. This allows you to point to one of the layouts which includes this layout, and at designtime this included layout will be rendered with the outer layout surrounding it. That allows you to view and edit the layout "in context".  Requires Studio 0.5.8 or later. More information in the release announcement.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     tools:showIn="@layout/activity_main"  />
Used by: Layout editor in Studio

tools:menu

Attribute set on the root element of a layout to configure the menus to be shown in the Action Bar. Android Studio tries to figure out which menus to use in the ActionBar by looking at the onCreateOptionsMenu() method in the activity linked to the layout (by tools:context). This allows you to override that search and explicitly state which menus to show. The value is a comma separated list of ids (without @id/ or any such prefix). You can also use the file names of the menu xml without the .xml extension. Requires Studio 0.8.0 or later.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     tools:menu="menu1,menu2"  />
Used by: Layout editor in Studio

tools:actionBarNavMode

Attribute set on the root element of a layout to configure the navigation mode used by the Action Bar. Possible values include: "standard", "list" and "tabs" Requires Studio 0.8.0 or later.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     tools:actionBarNavMode="tabs"  />
Used by: Layout editor in Studio

ref1:http://tools.android.com/tips/layout-designtime-attributes

ref2:http://tools.android.com/tech-docs/tools-attributes














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值