参考:http://gundumw100.iteye.com/blog/1139214
onFinishInflate 当View中所有的子控件均被映射成xml后触发
onSizeChanged 当view的大小发生变化时触发
先看一下执行顺序
ButtonWaveView 为自定义组合组件
MainActivity.java
这个结果为:
可以看出来,构造方法和onFinishInflate都在
常见的自定义组合控件 大多有两种
1、在onSizeChanged里面写
2、在onFinishInflate里面写
1、onSizeChanged
上面的代码onSizeChanged是不会执行 ,因为onSizeChanged()是在view大小发生改变时才执行
看我参考的那篇文章,所有代码都是在onSizeChanged里面写的 但是onSizeChanged不执行怎么办?所以 在构造方法里面
2、onFinishInflate
这个里面写也是可以的 但是会出现一个问题
假如说 我在Activity里面 需要设置自定义组件ButtonWaveView 的一些变量,而且这些变量(例如 width,height)是必须在addview前面调用的
我们的set方法肯定是写在onCreat里面的 但是前面我们也看到了 onFinishInflate是先于执行的 ,这时我们的程序就有问题了!
解决方法有两个
1、调用onSizeChanged
2、自定义控件属性,在调用控件构造方法时,去获得自定义属性
onFinishInflate 当View中所有的子控件均被映射成xml后触发
onSizeChanged 当view的大小发生变化时触发
先看一下执行顺序
ButtonWaveView 为自定义组合组件
public class ButtonWaveView extends LinearLayout {
public ButtonWaveView(Context context) {
super(context);
}
public ButtonWaveView(Context context, AttributeSet attrs) {
super(context, attrs);
System.out.println("ButtonWaveView");
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
System.out.println("onFinishInflate");
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
System.out.println("onSizeChanged");
}
}
MainActivity.java
public class MainActivity extends Activity {
private ButtonWaveView bwv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("1111111111111");
setContentView(R.layout.buttonwaveview);
bwv = (ButtonWaveView)findViewById(R.id.bwv);
System.out.println("22222222222222222222222");
}
}
这个结果为:
11111111111111
ButtonWaveView
onFinishInflate
22222222222222222222222
可以看出来,构造方法和onFinishInflate都在
setContentView(R.layout.buttonwaveview);
后开始执行。
常见的自定义组合控件 大多有两种
1、在onSizeChanged里面写
2、在onFinishInflate里面写
1、onSizeChanged
上面的代码onSizeChanged是不会执行 ,因为onSizeChanged()是在view大小发生改变时才执行
看我参考的那篇文章,所有代码都是在onSizeChanged里面写的 但是onSizeChanged不执行怎么办?所以 在构造方法里面
setBackgroundResource(R.drawable.tabswitcher_long);
设置背景图片,人为的改变view,这样就可以调用onSizeChanged了
2、onFinishInflate
这个里面写也是可以的 但是会出现一个问题
假如说 我在Activity里面 需要设置自定义组件ButtonWaveView 的一些变量,而且这些变量(例如 width,height)是必须在addview前面调用的
我们的set方法肯定是写在onCreat里面的 但是前面我们也看到了 onFinishInflate是先于执行的 ,这时我们的程序就有问题了!
解决方法有两个
1、调用onSizeChanged
2、自定义控件属性,在调用控件构造方法时,去获得自定义属性