Android:Tools命名空間使用技巧

【轉自https://www.jianshu.com/p/2912bcba4465】

1、tools 命名空間是啥?在哪裏有?

在Android Studio 中,咱們建立一個 xml 佈局文件以後,一般在自動生成的代碼中,會有一個 tools 命名空間: xmlns:tools="http://schemas.android.com/tools" 。以前一直不知道是幹嗎用的,歷來沒有用過,而後要麼手動刪除,要麼格式化代碼的時候就自動把它刪除了。直到今天翻看文檔時才發現,這玩意兒居然有大用途!javascript

2、tools 命名空間的做用有哪些?

根據官方文檔描述,根據其屬性的功能類別,大體有三種主要功能:php

  • xml中的錯誤處理
  • xml 預覽
  • 資源壓縮

說的通俗一點就是:html

  • 減小或者避免黃線提示,讓代碼更清爽,讓編譯少報錯
  • 讓預覽界面更靈活,能夠爲所欲爲的定製預覽視圖
  • 壓縮資源文件,下降APK體積。

3、tools 命名空間屬性功能詳解

該部份內容是基於官方文檔的總結整理,因爲我的水平有限,理解可能會有誤差,歡迎指正java

(一)、xml 中的錯誤處理屬性

一、tools:ignore

. 說明
應用範圍 xml中的任意元素
做用對象 Lint Lint 是AndroidStudio提供的代碼掃描工具
具體做用 讓Lint 工具在檢查代碼時忽略指定的錯誤。
取值說明 不一樣的錯誤對應不一樣的id,這些id 就是 ignore的取值。如:MissingTranslation。ignore後面能夠同時跟多個id,多個id之間使用逗號分割

示例1:
Lint 檢查時默認語言爲 英文,若是在 xml 中有中文,就會報 MissingTranslation 錯誤,咱們加上 tools:ignore 以後便可避免。android

<string name="show_all_apps" tools:ignore="MissingTranslation">All</string>
複製代碼

示例2:app

image.png

二、tools:targetApi

. 說明
應用範圍 xml的任意元素
做用對象 Lint
具體做用 同 java 代碼中的 @TargetApi 註解, 指明某個控件只在指定的API 及更高的版本中生效。這樣,在使用 Lint 檢測時就不會因 minSdkVersion 低於控件出現的版本而報錯。
取值說明 API 版本號對應的 int值

示例:dom

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:targetApi="14" >
複製代碼

三、 tools:locale

. 說明
應用範圍 <resources>
做用對象 Lint, Android Studio editor
具體做用 指明 resources 中元素的語言類型,避免拼寫檢查或者Lint 檢查時報錯。這二者中默認的語言類型時英文 es
取值說明

示例:
咱們在 values/strings.xml中指明元素的語言版本。編輯器

<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es">
複製代碼

(二)、xml視圖預覽相關屬性

如下屬性在xml中定義以後,只在預覽時會展現,正式部署以後並不會展現。相似於 DataBindg 中引用字符串資源時的 default 屬性。工具

一、用 tools:xxxx 替代 android:xxxx

. 說明
應用範圍 view
做用對象 Android Studio佈局編輯器
具體做用 將view的任意屬性值的 android 前綴替換爲 tools 以後,就能夠實現預覽效果。以tools 爲命名空間的屬性值只在預覽時有效。 另外,在預覽時,若是同時有 tools:xxx 和 android:xxx ,則優先展現 tools:xxx 的預覽效果, 可參考示例代碼2
取值說明 具體取值以view的屬性取值爲準。

示例代碼1:
預覽時展現指定文本佈局

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="歡迎關注 CnPeng 公衆號" />
複製代碼

示例代碼2:
tools:text 和 android:text 同時存在,在預覽時會優先展現 tools:text

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="這些在預覽時展現,並會在預覽時優先於 android:text 展現" android:text="這些在部署以後會展現" />

複製代碼

二、tools:context

. 說明
應用範圍 xml 中的根佈局
做用對象 Lint, Android Studio佈局編輯器
具體做用 聲明該佈局文件默認關聯的 activity。聲明以後會在佈局編輯器或者預覽界面中開啓一些與該activity相關的特性,好比,在寫 onClick時,直接輸入方法名,而後點擊自動完成代碼的快捷鍵就會提示你在對應activity中建立該方法。This enables features in the editor or layout preview that require knowledge of the activity, such as what the layout theme should be in the preview and where to insertonClickhandlers when you make those from a quickfix .
取值說明 關聯的activity。須要帶路徑,建議與清單文件中註冊 activity時的路徑保持一致。

示例代碼:
先聲明關聯的activity,而後直接寫 onclick 方法名,而後按下自動完成代碼的快捷鍵,就會提示在對應的activity中建立該方法。

三、tools:itemCount

. 說明
應用範圍 <RecyclerView>
做用對象 Android Studio 佈局編輯器
具體做用 在 <RecyclerView> 節點中設置該屬性以後,會指定在預覽界面中繪製/展現幾個條目
取值說明 int 類型數值

示例代碼:
預覽界面展現 4個 條目

四、tools:layout

. 說明
應用範圍 < fragment>
做用對象 Android Studio 佈局編輯器
具體做用 聲明在預覽時將哪一個佈局文件填充到該Fragment
取值說明 佈局id 的引用值

示例代碼:
在預覽時將 testlayout 這個佈局文件填充到fragment。testlayout的佈局中包含一個 RecyclerView,並經過 itemCount 設置的預覽時展現的條數爲4(參考 tools:itemCount)

五、tools:listitem 、 tools:listheader 、 tools:listfooter

. 說明
應用範圍 <AdapterView>及其子類,如<ListView>
做用對象 Android Studio 佈局編輯器
具體做用 指明 AdapterView在預覽界面中所展現的 條目、頭佈局、腳步局
取值說明 佈局文件的引用

示例代碼:
這裏略微有點尷尬,listfooter 在預覽時並無展現出來,不知道是否是我操做的姿式不對

item_spinner.xml

<?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:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal">
    
    <ImageView android:layout_width="@dimen/dp50" android:layout_height="@dimen/dp50" android:src="@drawable/logo" tools:ignore="ContentDescription"/>

    <!--ignore 後面根由多個錯誤id時,用逗號分隔 ; -->
    <TextView android:id="@+id/tv_item_suspendRv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="@dimen/dp10" android:gravity="center_vertical" android:text="abc" tools:ignore="HardcodedText,RtlHardcoded"/>

    <!--使用 tools:text 設置預覽文本-->
    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="這是設置的預覽文本"/>
</LinearLayout>

複製代碼

注意
若是 條目佈局中有 TextView及其子類控件

  • 若是設置了 tools:text , 在預覽時會優先展現該值;
  • 若是沒有設置 tools:text ,但設置了 android:text , 在預覽時就會展現android:text 的屬性值;
  • 若是都沒有設置,則會默認使用 item一、item2 填充到 TextView中做爲預覽文本

六、 tools:showIn

. 說明
應用範圍 全部 <view> 的根節點(即 佈局文件的根節點)
做用對象 Android Studio 佈局編輯器
具體做用 聲明該佈局文件將會被哪一個佈局經過 <include>引用。聲明以後,在對應的文件中不要忘了用 <include>引用
取值說明 佈局文件的引用。

示例代碼:

testlayout2.xml 將會被 testlayout 引用。

testlayout2.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/testFragment" 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" tools:showIn="@layout/testlayout" tools:text="預覽文本">

</TextView>
複製代碼

testlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
    <include layout="@layout/testlayout2"/>
    
</LinearLayout>
複製代碼

經過這種方式咱們在確認該佈局文件在哪裏使用了的時候就比較方便了。可是:

若是該佈局文件被多處 include 引用時,tools:showIn 該怎麼寫呢?哪位朋友知道煩請告知。

七、 tools:menu

. 說明
應用範圍 佈局文件的根節點(Any root <View>
做用對象 Android Studio佈局編輯器
具體做用 聲明在預覽界面中 AppBar 將展現哪些菜單
取值說明 menu文件的id,多個id 之間用逗號間隔。不須要任何前綴和後綴。The value can be one or more menu IDs, separated by commas (without @menu/ or any such ID prefix and without the .xml extension)

注意:按照官方文檔的說明,能夠傳入多個 menu id 。可是實際測試時發現,傳入多個時右上角並無什麼不一樣的顯示。

八、 tools:minValue / tools:maxValue

. 說明
應用範圍 <NumberPicker>
做用對象 Android Studio 佈局編輯器
具體做用 NumberPicker 設置預覽時的最小值和最大值
取值說明 int 型數值

示例說明:

這個加完以後,並無看到什麼特殊效果。

九、 tools:openDrawer

. 說明
應用範圍 <DrawerLayout>
做用對象 Android Studio佈局編輯器
具體做用 在預覽界面中將 DrawerLayout 打開。
取值說明 end、left、right、start。具體說明,參考下表
Constant Value Description
end 800005 Push object to the end of its container, not changing its size.
left 3 Push object to the left of its container, not changing its size.
right 5 Push object to the right of its container, not changing its size.
start 800003 Push object to the beginning of its container, not changing its size.

注意:
一、在 <DrawerLayout > 須要經過 layout_gravity 聲明哪一部分做爲側拉窗口,其取值也是 end、start、left、right。
二、tools:openDrawer 的取值必須與側拉窗口的 layout_gravity 的取值一致

代碼示例:

<?xml version="1.0" encoding="utf-8"?>

<!--此處 openDrawer 的取值必須與側拉窗口的 layout_gravity 取值一致-->
<android.support.v4.widget.DrawerLayout android:id="@+id/numberPicker" 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:openDrawer="right">

    <!--這是未展現側拉界面時的主體內容-->
    <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent">
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" tools:text="這是主內容"/>
    </RelativeLayout>

    <!--這是側拉窗口中的內容。必須經過 layout_gravity 屬性聲明這是一個側拉展現的內容-->
    <RelativeLayout android:layout_width="100dp" android:layout_height="match_parent" android:layout_gravity="right" android:background="#f2e67b">
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:ems="1" tools:text="這是要側拉的東西"/>
    </RelativeLayout>
</android.support.v4.widget.DrawerLayout>
複製代碼

十、 "@tools:sample/*" 資源

. 說明
應用範圍 全部支持顯示 text 或者 image 的view控件(Any view that supports UI text or images)
做用對象 Android Studio 佈局編輯器
具體做用 爲View設置佔位文本或圖片。這其實就是系統預置的一堆字符串和圖片資源,當你想設置預覽文本或者預覽圖片時,若是不想本身去定義,直接引用這些系統預置的字符串和圖片就能夠了
取值說明 參考下表
屬性值 說明
@tools:sample/full_names Full names that are randomly generated from the combination of @tools:sample/first_names and@tools:sample/last_names.
@tools:sample/first_names Common first names.
@tools:sample/last_names Common last names.
@tools:sample/cities Names of cities from across the world.
@tools:sample/us_zipcodes Randomly generated US zipcodes.
@tools:sample/us_phones Randomly generated phone numbers with the following format: (800) 555-xxxx.
@tools:sample/lorem Placeholder text that is derived from Latin.
@tools:sample/date/day_of_week Randomized dates and times for the specified format.
@tools:sample/date/ddmmyy
@tools:sample/date/mmddyy
@tools:sample/date/hhmm
@tools:sample/date/hhmmss
@tools:sample/avatars Vector drawables that you can use as profile avatars.
@tools:sample/backgrounds/scenic Images that you can use as backgrounds.

示例代碼:

在下面的預覽圖中,圖標和文本都是直接引用的系統預置的。

(三)、資源壓縮相關屬性 (Resource shrinking attributes)

下面這些屬性,可讓咱們在 資源壓縮時肯定哪些資源能夠保留或者丟棄,也可讓咱們開啓嚴格模式的資源引用檢查。 The following attributes allow you to enable strict reference checks and declare whether to keep or discard certain resources when using resource shrinking

開啓資源壓縮時,在 module 的build.gradle 文件做以下修改:

android {
    buildTypes {
        release {
            shrinkResources true    //開啓資源壓縮。minifyEnabled 也必須爲true,不然編譯不經過
            minifyEnabled true     //開啓代碼混淆/壓縮
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
複製代碼

一、 tools:shrinkMode

. 說明
應用範圍 <resources>
做用對象 開啓了資源壓縮的構建工具Build tools with resource shrinking
具體做用 指明 構建工具在壓縮資源時使用哪一種模式:safe mode 、strict mode
取值說明 safe、strict
模式 說明
safe 保留被顯示引用的,或者可能經過Resources.getIdentifier()被動態引用的資源
strict 保留 resources 或者 代碼中 被顯示引用的資源

默認是 safe 模式 (即shrinkMode="safe"). 若是想使用 strict 模式,須要在<resources>節點中顯示聲明 shrinkMode="strict",具體以下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:shrinkMode="strict" />
複製代碼

開啓 strict 模式以後, 可使用 tools:keep 保留那些你不想被移除的資源, 或者使用tools:discard 直接移除資源

二、 tools:keep

. 說明
應用範圍 <resources>
做用對象 開啓了資源壓縮的構建工具
具體做用 使用資源壓縮去移除未被使用的資源時,該屬性將容許你指明哪些資源能夠被保留(好比一些經過Resources.getIdentifier() 間接引用的資源)
取值說明 資源文件的引用

使用時,在 resources 目錄下建立一個 xml 文件並指定名稱,如:res/raw/keep.xml。建立一個<resources> 節點,併爲tools:keep賦值,其值表明將被保留的資源,多個資源之間使用逗號間隔,也可使用 * 做爲通配符,示例以下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/used_1,@layout/used_2,@layout/*_3" />
複製代碼

三、 tools:discard

. 說明
應用範圍 <resources>
做用對象 開啓了資源壓縮的構建工具
具體做用
取值說明

當使用資源壓縮工具去除一些無用資源時,使用該屬性能夠指明一些須要手動刪除的資源 (好比:被引用了可是未能生效的資源,或者 Gradle 插件誤引用了某些資源被引用).

使用時,在 resources 目錄下建立一個 xml 文件並指定名稱,如:res/raw/keep.xml。建立一個<resources> 節點,併爲tools:keep賦值,其值表明將被保留的資源,多個資源之間使用逗號間隔,也可使用 * 做爲通配符,示例以下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:discard="@layout/unused_1" />
複製代碼

4、參考資源:

tools 命名空間的官方文檔:
developer.android.google.cn/studio/writ…

命名空間介紹:
blog.csdn.net/p106786860/…

註解參考:
developer.android.google.cn/studio/writ…

lint 參考:
developer.android.google.cn/studio/writ…

資源壓縮shrink-resources
developer.android.com/studio/buil…

本文到此結束,謝謝觀看!
若有不足,敬請指正!

相關文章
相關標籤/搜索