1. 程式人生 > >關於android layout佈局中的tools屬性

關於android layout佈局中的tools屬性

一、為何要使用tools

安卓開發中,在寫佈局程式碼的時候,AS可以看到佈局的預覽效果。
以TextView為例
  <TextView
        android:id="@+id/tv_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:text="張三"/>
我們開發介面的時候,為了方便預覽效果,經常都會給TextView設定一個android:text,以便預覽效果,然後等開發除錯完畢後再刪除該text,然而實際情況是,
我們開發完畢後往往忘了刪除,導致程式可能因為沒有設定text而顯示預設的text,從而導致顯示錯誤。比如
TextView tv_username = (TextView) findViewById(R.id.tv_username);
if(null!=user){
	tv_username.setText(user.getUserName());
}
上面判斷當user不等於null時,才給TextView設定,如果user=null的話,則會顯示預設佈局中的”張三“,這樣就導致了顯示錯誤。
因此為了避免上述問題,我們可以使用tools名稱空間以及其屬性來解決
xmlns:tools="http://schemas.android.com/tools"
tools可以告訴Android Studio,哪些屬性在執行的時候是被忽略的,只在設計佈局的時候有效。比如我們要讓android:text屬性只在佈局預覽中有效可以這樣
<TextView
	android:id="@+id/tv_username"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:textSize="16sp"
	tools:text="張三" />
tools可以覆蓋android的所有標準屬性,將android:換成tools:即可。
在執行的時候tools:本身是被忽略的,不會被帶進apk中,不用我們手動刪除。

二、tools支援的屬性

1、支援所有的android屬性,只需要將android:換成tools:即可
2、壓制lint警告
  • tools:ignore

表示忽略這個警告

比如忽略ImageView的contentDescription屬性,則新增tools:ignore="contentDescription",如果不知道具體屬性,可使用tools:ignore="all"壓制所有警告。

  • tools:targetApi

指定該View顯示的目標api

假設你的應用支援minSdkLevel=15,而你使用了api21中的控制元件比如RippleDrawable,就可以使用tools:targetApi不顯示這個警告

3、其他非android標準屬性
  • tools:context
當前的Layout檔案裡面設定對應的渲染上下文,說明你當前的Layout所在的渲染上下文是tool:context對應的那個activity,如果這個activity在manifest檔案中設定了Theme,那麼ADT的Layout Editor會根據這個Theme來渲染你當前的Layout。就是說如果你設定的MainActivity設定了一個Theme.Light(其他的也可以),那麼你在視覺化佈局管理器裡面看到的背景啊什麼的就應該是Theme.Light的樣子。
比如tools:context="com.support.tools.MainActivity"
  • tools:menu
告訴IDE 在預覽視窗中使用哪個選單,這個選單將顯示在AppBar上(右上角),多個選單用逗號隔開
比如tools:menu="main,main2"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:menu="main,main2"
   ">
</LinearLayout> 
需要注意,當主題為Theme.AppCompat時,這個屬性不起作用
  • tools:actionBarNavMode
告訴IDE  AppBar(Material中對actionbar的稱呼)的顯示模式,其值可以是standard、tabs、list
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:actionBarNavMode="tabs"
   ">
</LinearLayout> 
注意:該屬性只有holo主題才有效。
  • tools:listitem/listheader/listfooter
在ListView、GridView等列表容器的預覽效果中新增頭部、尾部以及子item的預覽佈局。比如
<ListView
        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"
        />
  • tools:layout
<fragment>標籤顯示的佈局,比如
<fragment
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:name="com.support.tools.MyFragment"
	tools:layout="@layout/fragment"
	/>

參考: