赞
踩
每当创建新项目的时候,在MainActivity的布局文件layout中的根节点上都有一个xmlns:tools=”http://schemas.android.com/tools”的命名空间声明,以前一直认为没什么用处,知道最近看了文档才知道tools包含很多很实用的属性,下面就记录下tools一些主要属性的用法。
Android Studio支持在tools命名空间中定义的许多XML属性来使用一些设计时使用的特性,例如在界面预览中显示fragment的布局。还有一些编译时行文,例如开启资源压缩模式来压缩你的XML布局资源。当你编译你的app时,编译工具就会清除tools声明的属性,所以对APK的大小和运行时行为没有任何影响。
使用tools属性很简单,首先需要在XML布局的根节点中声明tools命名空间,例如下面代码所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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>
下面3个属性主要是用来消除Lint的警告出错信息。
<string name="show_all_apps" tools:ignore="MissingTranslation">All</string>
<GridLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:targetApi="14" >
例如,可以在values/string.xml文件中使用locale属性来指定字符串默认使用的语言。
<resources xmlns:tools="http://schemas.android.com/tools"
tools:locale="es">
下面的属性定义可以在Android Studio中布局预览界面中查看布局的特性。这些属性比较重要,可以使用tools来在设计界面时显示效果。
例如,我们在编写TextView时想查看字体大小或样式时,一般是使用android:text赋值一些字符串,这种做法是错误的。应该使用tools:text属性来指定一些字符串,但这些tools:text中的字符串只能在界面预览中可见,在APP运行期间这些数据时没有作用的。
在布局文件中可以同时使用android:和tools:来给相同的属性赋值,这两种是不会冲突的,android:属性主要用于运行期间,和tools:属性主要用于界面预览期间。
这个属性也可以用来在界面预览时复位一个属性。例如,在一个FrameLayout中有两个Button,你想查看其中一个Button的界面预览,你可以设置另外一个Button在界面预览不可见,例如:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="First" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Second"
tools:visibility="invisible" />
第二个Button将在界面预览中被隐藏,但是在运行时没有隐藏,因为没有设置android:visibility属性。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onButtonClicked(View view){
Log.e("Test","onClicked");
}
}
然后就可以在XML布局中Button元素节点中使用android:onClick来绑定这个Click事件处理者,达到解耦:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.jason.mvvmtest.MainActivity">
<Button
android:id="@+id/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="test"
android:onClick="onButtonClicked"/>
要使用这个特性,必须在根布局中使用tools:context属性来关联与当前布局相关的activity,可以使用简写或者使用全路径来指定activity的路径:
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
例如activity布局:
<?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:id="@+id/activity_main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.jason.mvvmtest.MainActivity">
<fragment
android:name="com.example.jason.mvvmtest.HeadFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:layout="@layout/fragment_head_img"/>
</LinearLayout>

fragment中布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/headimg"/>
</LinearLayout>
以上代码就可以在activity中的预览界面中显示fragment的布局了。
<ListView
android:id="@+id/ListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/listview_item"
tools:listfooter="@layout/listview_footer"
tools:listheader="@layout/listview_header"/>
item,header和footer布局只是一个text 运行效果如下所示:
这个属性在Android Studio2.2中不能正常运行,在2.3以上已经修复。
Android Studio2.3下载链接:http://tools.android.com/download/studio/builds/android-studio-2-3-beta-4
<include
layout="@layout/include_text"/>
当没有使用tools:showIn属性时,复用布局界面预览只显示这个布局内容,如下所示:
当在根节点元素中加入tools:showIn=”@layout/activity_main” 属性后就可以在复用布局中看到整个父布局和它在父布局中的显示效果了:
<?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" />
以下介绍的属性在使用资源压缩时,会开启严格的引用检查,或者可以声明保持或者丢弃某些资源。
开启资源压缩很简单,只需要在build.gradle文件中设置shrinkResources 属性为true就开启了。属性minifyEnabled 指的是代码压缩,在编译时会清除一些没有使用到的代码文件,从而减小APP的大小。如下代码同时开启了资源压缩和代码压缩。
android {
...
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:shrinkMode="strict" />
当开启了严格模式后,你需要使用tools:keep属性去保留你需要保留的资源,使用tools:discard属性去显式地删除多余的资源。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/activity_main,@layout/listview_item" />
可以使用星号作为一个通配符,模糊匹配。
<?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" />
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:discard="@layout/unused_1" />
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。