先定义两个view用于监听view的绘制流程:
MyIncludeView1
@SuppressLint("AppCompatCustomView")
public class MyIncludeView1 extends TextView {
public MyIncludeView1(Context context) {
super(context);
Log.e("111", "MyIncludeView1111 构造方法(1)了,,,,,,,,,,,,,,,,");
}
public MyIncludeView1(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
Log.e("111", "MyIncludeView1111 构造方法(2)了,,,,,,,,,,,,,,,,");
}
public MyIncludeView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Log.e("111", "MyIncludeView1111 构造方法(3)了,,,,,,,,,,,,,,,,");
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.e("111", "MyIncludeView1111 被onMeasure了,,,,,,,,,,,,,,,,");
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.e("111", "MyIncludeView1111 被onDraw了!!!!!!!!!!");
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Log.e("111", "MyIncludeView1111 被onLayout了。。。。。。。。。。。");
}
}
MyIncludeView2
@SuppressLint("AppCompatCustomView")
public class MyIncludeView2 extends TextView {
public MyIncludeView2(Context context) {
super(context);
Log.e("111", "MyIncludeView2 构造方法(1)了,,,,,,,,,,,,,,,,");
}
public MyIncludeView2(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
Log.e("111", "MyIncludeView2 构造方法(2)了,,,,,,,,,,,,,,,,");
}
public MyIncludeView2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Log.e("111", "MyIncludeView2 构造方法(3)了,,,,,,,,,,,,,,,,");
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.e("111", "MyIncludeView2 被onMeasure了,,,,,,,,,,,,,,,,");
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.e("111", "MyIncludeView2 被onDraw了!!!!!!!!!!");
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Log.e("111", "MyIncludeView2 被onLayout了。。。。。。。。。。。");
}
}
设置用于include的布局:
activity_include.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="50dp"
android:orientation="vertical">
<com.android.imooc.MyIncludeView1
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="我是第一个"
android:textColor="#000000"
android:textSize="20sp" />
</LinearLayout>
测试一:
activity_include_layout.xml:
include导入一个activity_include.xml,MyIncludeView2设置visible
<?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"
android:orientation="vertical">
<include layout="@layout/activity_include" />
<com.android.imooc.MyIncludeView2
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="我是第二个"
android:textColor="#ff0000"
android:textSize="20sp"
android:visibility="visible" />
</LinearLayout>
打印log:
MyIncludeView1111 构造方法(2)了,,,,,,,,,,,,,,,,
MyIncludeView2 构造方法(2)了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView2 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView2 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onLayout了。。。。。。。。。。。
MyIncludeView2 被onLayout了。。。。。。。。。。。
MyIncludeView1111 被onDraw了!!!!!!!!!!
MyIncludeView2 被onDraw了!!!!!!!!!!
发现:
include导入1个则:构造方法,onMeasure,onLayout,onDraw就会走1遍,
visible会走一遍:构造方法,onMeasure,onLayout,onDraw
测试二:
activity_include_layout.xml:
include导入两个activity_include.xml,MyIncludeView2设置invisible
<?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"
android:orientation="vertical">
<include layout="@layout/activity_include" />
<include layout="@layout/activity_include" />
<com.android.imooc.MyIncludeView2
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="我是第二个"
android:textColor="#ff0000"
android:textSize="20sp"
android:visibility="invisible" />
</LinearLayout>
打印log:
MyIncludeView1111 构造方法(2)了,,,,,,,,,,,,,,,,
MyIncludeView1111 构造方法(2)了,,,,,,,,,,,,,,,,
MyIncludeView2 构造方法(2)了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView2 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView2 被onMeasure了,,,,,,,,,,,,,,,,
MyIncludeView1111 被onLayout了。。。。。。。。。。。
MyIncludeView1111 被onLayout了。。。。。。。。。。。
MyIncludeView2 被onLayout了。。。。。。。。。。。
MyIncludeView1111 被onDraw了!!!!!!!!!!
MyIncludeView1111 被onDraw了!!!!!!!!!!
发现:
include2个则:构造方法,onMeasure,onLayout,onDraw就会走2遍,
invisible只会被:构造方法,onMeasure,onLayout,不会被onDraw
测试三:
activity_include_layout.xml:
不导入activity_include.xml,MyIncludeView2设置gone
<?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"
android:orientation="vertical">
<com.android.imooc.MyIncludeView2
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="我是第二个"
android:textColor="#ff0000"
android:textSize="20sp"
android:visibility="gone" />
</LinearLayout>
打印log为
MyIncludeView2 构造方法(2)了,,,,,,,,,,,,,,,,
说明:
不include,则不走构造方法、onMeasure,onLayout,onDraw
设置view的gone:只走构造方法
结论:
include会灵活用于代码的复用,
include一次view就会走一次:构造方法、onMeasure,onLayout,onDraw
view设置gone, 走:构造方法,不走onMeasure,onLayout,onDraw
view设置invisible,走:构造方法、onMeasure,onLayout,不走onDraw
view设置visible, 走:构造方法、onMeasure,onLayout,onDraw