文档章节

Activity加载View调用顺序

 扑朔迷离_Li
发布于 2014/03/27 11:23
字数 490
阅读 141
收藏 0

     在Activity的onCreate方法中,可以通过setContentView()方法来设置此Activity要显示的界面。在xml中的布局文件需要先解析成View树才能加载显示,通过View的onMeasure,onLayout,onDraw方法完成View的测量大小,布局以及View自身的绘制。在此想说一下Activity生命周期的onCreate,onStart,onResume方法和View自身的测量,布局等方法的调用顺序问题。

   先重写Activity的这几个方法并打印log

public class FlowActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.e("onCreate", "onCreate");
		setContentView(R.layout.flow);
	}

	@Override
	protected void onResume() {
		Log.e("onResume", "onResume");
		super.onResume();
	}

	@Override
	protected void onStart() {
		Log.e("onStart", "onStart");
		super.onStart();
	}
}

   在重写ViewGroup方法FlowLayout

public class FlowLayout extends ViewGroup {
	public FlowLayout(Context context) {
		super(context);
	}

	public FlowLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public FlowLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		Log.e("onMeasure", "onMeasure");
		setMeasuredDimension(totalWidth, resolveSize(totalHeight, heightMeasureSpec));
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		Log.e("onSizeChanged", "onSizeChanged");
		super.onSizeChanged(w, h, oldw, oldh);
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		Log.e("onLayout", "onLayout");
	}

	@Override
	protected void onFinishInflate() {
		Log.e("onFinishInflate", "onFinishInflate");
		super.onFinishInflate();
	}
}

打印Log可以看出Activity生命周期的函数和View的测量,布局等函数的调用顺序。

因此,我们通常在onCreate方法里面是获取不到某个View测量的宽高值,获取的值为0.

只有当Activity的onResume方法调用完毕之后,当前的窗口将要显示可见,才会去测量,绘制View树。setContentView方法只是把xml文件解析为View树的过程,并没有发起绘制View树。当解析完毕之后会调用OnFinishInflate方法,完成解析。

当View的“大小”发生改变的时候会调用onSizeChanged方法,这个大小,个人理解为布局大小,并非测量大小。是在onMeasure之后,onLayout之前调用的方法。

理解了这些调用顺序,我们可以知道在何时去获取或设置一些值。


© 著作权归作者所有

粉丝 0
博文 2
码字总数 1850
作品 0
海淀
私信 提问
Activity窗口绘制和Window、PhoneWindow、DecorView、setContentView的执行顺序

-- DecorView构成 -- Window、PhoneWindow、DecorView、setContentView Window窗口布局 --- DecorView浅析- https://www.cnblogs.com/yogin/p/4061050.html Activity onCreate()中调用setCo......

desaco
2018/11/17
0
0
Fragments (Android官方文档中文版)

Fragment 表现 Activity 中用UI的一个行为或者一部分.可以组合多个fragment放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity里重用某一个fragment.把fragment想象成一...

长平狐
2012/10/09
1K
2
android之Fragment(官网资料翻译)

Fragment要点 Fragment作为Activity界面的一部分组成出现 可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用。 在Activity运行过程中,可以添加、移除...

随智阔
2013/05/26
0
0
Android&Java面试题大全—金九银十面试必备

声明本文由作者:Man不经心授权转载,转载请联系原文作者 原文链接:www.jianshu.com/p/375ad1409… 类加载过程 Java 中类加载分为 3 个步骤:加载、链接、初始化。 加载。 加载是将字节码数...

codeGoogle
2018/10/30
0
0
Android中Fragment的应用 android3.0

转载: http://blog.sina.com.cn/s/blog_5d6ee3360100r1my.html Fragment 表现 Activity 中用UI的一个行为或者一部分. 可以组合多个fragment放在一个单独的activity中来创建一个多界面区域的...

迷途d书童
2012/03/26
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

跨域的理解,以及解决方案!

/*什么是跨域? * 跨域的主要原因是浏览器的同源策略。 * =>>所谓的同源策略就是A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。 * 什么是同源? * =>>同源就是协议相同、域名相同...

流年那么伤
6分钟前
1
0
Nginx配置try_fiels,php无法获取$_GET参数

平时开发都是用LNMP,新安装的虚拟机在配置nginx的rewrite的时候使用try_files命令。但是在写的时候配置成“try_files $uri $uri/ /index.php?q=args;”, 在PHP的web程序中,打印$_GET为空。...

叫我哀木涕
6分钟前
0
0
【原创】Microsoft Edge可以用localhost访问但无法用IP访问

Microsoft Edge可以用localhost和127.0.0.1访问但无法用本机IP访问, chrome ie都可以推测是edge的问题,网络是专用网络,防火墙也关了: 在edge里 按F12 以在控制台里看到这句 CONSOLE21301...

shzwork
7分钟前
0
0
Python利用数学方程式画4种不一样的心型图案

前言 下面这四个心型图案,是通过科学地计算,根据数学方程式生成的,虽然做的不是特别完美,但是基本的还是能实现的 第一个心型 结果图 第二心型 结果图 学习从来不是一个人的事情,要有个相互监...

A_裙232550246
7分钟前
0
0
微信带场景参数的二维码生成与使用?

微信公众号推广时,用户通过扫二维码关注公众号,需要统计用户是通过谁的二维码进行关注。 在用户扫码关注公众号时,二维码带上推广者的参数,在关注公众号后,获取到该推广者的参数。 目前有...

wxgzhgncj
7分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部