android自定义组合控件onFinishInflate和onSizeChanged的区别

android自定义组合控件onFinishInflate和onSizeChanged的区别参考:http://gundumw100.iteye.com/blog/1139214onFinishInflate当View中所有的子控件均被映射成xml后触发onSizeChanged当view的大小发生变化时触发先看一下执行顺序  ButtonWaveView为自定义组合组件publicclassButtonWaveViewextendsLine

参考:http://gundumw100.iteye.com/blog/1139214




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、自定义控件属性,在调用控件构造方法时,去获得自定义属性


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38786.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注