Android : Tools Attributes

各位 Android 開發者若已經改採用 Google 官方所推薦的 Android Studio 作為開發時的 IDE 的話,那麼,在編輯 layout 的 XML 檔案時,有沒有注意到像是 Activity 的 root Layout 新增了 http://schemas.android.com/tools 這樣的一個 namespace,並且在 root Layout 的屬性 (attribute) 中多了以 tools: 這個 namespace 開頭的 attribute tools:context="your_activity" 這樣的屬性呢?

這個新的 namespace 是在哪個版本後加入的,筆者也不太清楚…趁著最近專案告一段落之際(所以才有時間寫部落格呀),閱讀到一些有關這個 namespace 的妙用,本篇就幾個較感興趣運用方式作介紹。


tools: context

這個屬性基本上是設定在 Activity 的 Layout XML 的根元素 (root element) 上,記錄該 Layout 所屬的 Activity/Activities (一個 Layout 可以被多個 Activity 重複使用),藉由記錄該 Layout 所屬的 Activity 這個動作,Android Studio 便能夠取得該 Activity 的佈景主題 (theme,每個 Activity 可以有自己所要套用的 theme),並且在 Preview 視窗中顯示套用套用該主題後的預覽畫面。

<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"
    tools:context=".CameraActivity">

tools: ignore

這個屬性可以設定給任何的XML元件,簡單來說,這個屬性通知 Lint 遞迴地忽略 tools:ignore="checking_condition" 中的條件,常見的像是在編輯 strings.xml 這個 reosurce file 的時候,Lint 會 一直提醒 你某些字串尚未被翻譯,但是其實這個字串根本不需要被翻譯時,這時像是以下的設定就相當有用:

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

note: 遞迴地忽略,表示該XML元素的子元素們也都將一併被忽略。


tools: text

這個屬性的出現,實在讓人為之振奮!
怎麼說呢?不曉得在開發過程中,您是否有過這樣的需求且有過這樣的問題:

  • 需求:在設計階段,希望預覽的畫面上可以看到實際套用某些文字後的實際效果,但是...
  • 問題:
    1. 這個在設計階段所被填充的文字,在 App 實際運作的時候其實一點用都沒有,可能會由其他方式所取得的資料代之
    2. Lint 會提醒您,您使用了 hardcoded Strings,但是壓根兒不想用上面提到的 tools:ignore="HardcodedText" 來忽略這個問題,畢竟這是不良的開發習慣
    3. 即使把 String 加入 resource 中利用 R.strings.string_id 來避免上述問題,最後還是得面臨得把該字串資源從檔案中移除的命運

tools:text="Your Test Text Here" 徹底的解決了上述的問題,因為使用 tools:text 所給定的文字只在「設計階段」有效果而已!直接看看下面的例子與圖例,或是打開你的 Android Studio 實際操作一下,便能感受到該功能帶來的便利性:

<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="wrap_content"
    android:background="@drawable/cell_background"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:id="@+id/from"
        style="@style/List.From"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="來自路人甲"/>

    <TextView
        android:id="@+id/title"
        style="@style/List.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/from"
        tools:text="我是抬頭,不是低頭族" />

    <!-- 略... -->

</RelativeLayout>


如此一來,再也不需要為了在設計階段所需要的文字預覽效果,而採用設定 android:text 屬性所造成的麻煩而擔心了!


tools: listitem / listheader / listfooter

這幾個屬性從字面上看來,大家應該都猜得到是用在 ListView 這個元件身上的,一般來說,在設計階段時,我們所建立的 ListView 的 Layout 在預覽視窗中會像下圖:

而透過加入 tools:listitem="@layout/your_row_item_here" 的屬性,便可以將我們所精心設計好的 ListView 的 Item 的 Layout,以它應有樣式的姿態出現在 ListView 中!

實際看看程式碼跟圖例:

<ListView
    android:id="@+id/list_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:listitem="@layout/item_row" />

是不是蠻神奇的呢?


實際上,若是各位詳讀延伸閱讀中的 Android Tools Project Site: Designtime Layout Attribute 內容的話,你會發現其實我們「可以將任何 namespace 為 android: 的屬性,改為採用 tools: 這個 namespace」來顯示在設計階段的一些預覽效果。

我個人認為這樣頗有利於與 UI 設計師討論與溝通,也減少 Programmer 在介面這塊的不少麻煩,個人相當喜歡 tools:attr 所帶來的便利性,總而言之...一句話:「Z > B」呀!


延伸閱讀:


comments powered by Disqus