使用viewstub实现延迟加载
viewstub是一个惰性控件,大小为0且不可视,它可以延迟到运行时才填充布局,相比include,他在填充前不消耗资源。其应用场景主要是动态加载某些布局。
include_layout.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">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text"
android:drawableBottom="@mipmap/ic_launcher"/>
</LinearLayout>
布局文件
<ViewStub
android:id="@+id/viewstub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout="@layout/include_layout"/>
java代码
show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mView==null){
mView=mViewStub.inflate();
}
mTextView= (TextView) mView.findViewById(R.id.text);
mTextView.setText("hhbjkhk");
mViewStub.setVisibility(View.VISIBLE);
}
});
display.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewStub.setVisibility(View.GONE);
}
});
- viewstub通过layout属性引入布局,但不能导入控件;
- viewstub通过inflate()或setVisibility()填充布局,inflate()只能调用一次;
- 要获得子布局中的控件,需要用inflate()返回的View来findviewbyid获得;
- 子布局跟标签不能用merge
用merge减少布局层次
当一个独立布局文件的根标签是framelayout且没有设置background等属性时,使用merge代替可以减少布局层次,其相当于直接把布局中的子view添加到了父标签中。当include的子布局根标签是relativelayout也可以替换成merge。
详细分析看这篇
Android布局优化之ViewStub、include、merge使用与源码分析
使用compounddrawable
相邻的imageview和textview可以使用compounddrawable合二为一,在textview中使用drawableTop来加载图片:
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text"
android:drawableBottom="@mipmap/ic_launcher"/>
效果:
使用layout_weight
使用layout_weight时会使控件被测量两次,当非0dp的linearlayout嵌套时,测量次数会指数增加,所以在使用layout_weight时其layout_width或layout_height要设为0dp
最后,我们可以使用lint来检查布局,具体使用看
参考《android高级进阶》