[譯]精通 Android 中的 tools 命名空間

原文:http://blog.alexsimo.com/mastering-tools-namespace-android/

作者Alexandru Simonescu ( blog.alexsimo.com )

譯文:http://www.jianshu.com/p/a39dddb46bd8

譯者:lovexiaov ( lovexiaov.cn )


今天推薦給各位的是lovexiaov同學的譯文,這篇文章講述的雖是一個技術小細節,但若能掌握好它,對我們日常開發的效率提升是很有幫助的,我個人平時也沒太注意文中提到的一些地方,看完感覺對我還是有幫助的,因此也推薦給大家。


值得一提的是,lovexiaov的原文譯文是同步附帶英文原文的,主要是擔心有錯漏以方便大家校正,這種嚴謹的態度值得肯定,但我校對過後認爲譯文沒有太大問題,考慮在手機上的閱讀效果,經他同意移除了英文原文部分,便於大家流暢閱讀。

你可能注意到了 tools 命名空間會出現在許多 Google 提供的樣例佈局 XML 文件中。此命名空間在開發階段很有用,而且不會影響用戶體驗。它包含了一套方便的屬性,幫助我們在 Android Studio 設計視圖中渲染布局。

有時這些巧妙 ( tricky )的屬性會節約我們的構建時間。我並不是說會加快構建速度,而是界面修改相關的構建會減少。


tools 命名空間的 URI 是 http://schemas.android.com/tools,通常使用 tools 前綴綁定,但你也可以使用任何其他前綴。

該命名空間中的所有屬性都不會影響運行時或 apk 的大小,它們會在 Gradle 打包應用時被剝離出去。

你可以使用 Android Studio 提供的快捷鍵快速添加 tools 命名空間。只需輸入 toolsNS 然後按下 TAB 鍵。


值得一提的是,截止到寫這篇文章時,Android Studio 並沒有太多對此 xml 語法補全支持,不過別擔心,即使 AS 沒有語法提示,你仍然可以覆寫 tools 屬性。最簡單的使用方式是:首先書寫基於 android: 命名空間的屬性,然後使用 CMD + D 複製這行,並替換它的前綴(爲 tools)。


開始使用

當我剛做 Android 開發時,曾使用 android:text=”” 屬性結合一些硬編碼的假文本在 預覽窗口 中查看 TextView 或 EditText 如何顯示。但是 Lint 工具會檢查出硬編碼字符串的問題,最後我只能去定義 strings(來消除此問題),然而這樣做對用戶沒有任何意義,還使我的 .apk 中包含了沒用的資源。

(解決上述問題的)技巧是使用 tools:text”@string” 來在預覽窗口中查看預填充了數據的View。你會得到類似如下的 xml 代碼:


使用以上代碼片段,在設計時你會看到 TextView 中的文字,而在運行時將不會有該屬性存在。

運行時和設計時的不同屬性

需要注意的是你可以同時使用 android 和 tools 命名空間。tools 命名空間將會用在設計階段,而前者會用在運行時。

有時你希望在運行時開啓某些特性,而在設計預覽時關閉它。Android 文檔展示了 ListView 的例子:


這裏你可以看到:在運行時開啓了 fastScrollAlwaysVisible 功能,而在設計時關閉了它。

其實你可以覆蓋所有已存在於 android 命名空間中的屬性,但無法覆蓋自定義屬性。

在 XML 中設置 Target API

你可以在 XML 中設置 Target API,就像在 Java 中使用 @TargetApi 一樣。API 版本可以通過一個整型或它的代號指定。這將避免 Lint 報特定版本 XML 屬性的問題。


由於 Android Studio / Lint 默認語言是英語,如果你有其他語言的字符串資源,它將會顯示如下的排版警告。


告知 Lint 你本地化資源的技巧:


這樣就不會顯示排版警告了。

預覽 fragment 和自定義View的佈局

我發現這(tools 命名空間)在使用 Fragment 和自定義View時非常有用。通過 tools:layout=”@layout/your_layout” 屬性你可以設置在預覽窗口中顯示一個佈局。


上述代碼使用了 tools:layout 屬性來預覽 BooksFragment 佈局,而不用將工程運行在設備或模擬器上。

我們來看一下View結構:

activity_main:


fragment_book:


fragment_book_list_item:


打開 activity_main 的預覽窗口,你將會看到如下界面:


預覽列表項佈局

如果你比較細心,你會看到上面 xml 代碼片段中的 tools:listitem=”” 一行。這在預覽列表時會顯示你自定義的列表項而不是默認的 @android:layout/list_content”。

還有更多相關的屬性,但是 RecyclerView 沒有 header 或 footer 屬性(這兩個屬性只能用在 ListView 上)。這兩個屬性分別是 tools:listheader 和 tools:listfooter。

帶父容器上下文的View

假如你有一個自定義View,或可重用的佈局會通過標籤被用在許多地方。當設計該View時,在想要包含它的父容器中預覽它會如何顯示,將會很有幫助。

在上面的 fragment_book_list_item 中,如果我們添加 tools:showIn=”@layout/activity_main” 屬性,將可以預覽該列表條目如何顯示在 activity_main 中。這沒有多大意義,只是爲了演示這個概念。


預覽界面將類似於這樣:


該特性也依賴於 Android Studio 的版本。截止寫此文時,我使用的是 Android Studio v2.1。

關聯 XML 到一個 activity 上

我很確定你已經知道該屬性了,當我們使用 Android Studio 引導創建一個 Activity 時,在默認生成的 XML 文件中你會找到該屬性 tools:context=”.MainActivity”。如你所知,單個 xml 佈局可以被用在多個 Activity 或 Fragment 中,使用此屬性,你就告訴了 Android Studio 哪個 .java Activity 類與之相關聯。

這將幫助佈局修改者猜測 Activity 的主題,因爲主題曾被定義在 AndroidManifest.xml 文件中。

忽略 Lint 警告

你應該謹慎使用此屬性,因爲忽略 Lint 警告不是一個好主意。如果 Lint 上報問題,你應該行動起來並修復錯誤和警告。但有時 Lint 給出的是錯誤警告,我們明確知道(或許不知道)我們在做什麼。這種情況下你可以使用 tools:ignore=””。

想象一下我們有一個圖標找不到它對應的像素密度文件夾,我們可能會使用 tools:ignore=”IconMissingDensityFolder” 忽略 Lint 警告。你可以在 Android 官方文檔 中閱讀更多關於 Lint 的內容。

預覽帶菜單的佈局

默認情況下,定義在 Activity.onCreateOptionsMenu() 中的菜單會被渲染到預覽窗口。但你可以使用 tools:menu=”comma separated menu IDs” 覆蓋此菜單。我個人不會使用該屬性,但它可能會對你有用。

設置 Toolbar 導航模式

此屬性很簡單!使用 tools:actionBarNavMode=”standard|list|tabs” 你可以設置 ActivityBar 的導航模式。

縮減資源

Android tools 命名空間中有許多關於縮減資源的屬性,比如 tools:shrinkMode=”strict|safe”,tools:keep=”@layout|layout_wildcard”,tools:discard=”@layout/unused” 等,但我不準備在此討論它們,因爲本文不是討論縮減資源的,如果你感興趣,可以在 Android Studio 官方文檔中瞭解更多信息。

References:

  • http://tools.android.com/tips/layout-designtime-attributesAndroid Stu

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章