初入android开发的使用,最早熟悉的,恐怕就是findViewById和SetOnClickListener,当然,有时候我们为了偷懒,不去findViewById,而是直接在布局文件中写android:OnClick="方法名",然后在Activity中对应的方法,一样也好使。不过,这样背后的原理是什么呢。这值得我们去格一格。
打开View的源码,翻到构造函数里,可以看到,View通过TypedArray实例化加载布局文件,然后循环设置属性(这就是经常说布局不宜太深,视图元素不能太多的原因)。
直接翻到有关android:OnClick相关的代码,可以看到如下:
![]()
如果视图组件设置了android:OnClick属性,那么就设置他的OnClickListener为一个DeclaredOnClickListener实例。
去看看DeclaredOnClickListener,代码不多
![]()
分析如下:
如果OnClick方法被执行
- 首先获取视图组件对应的activity上下文信息
- 利用反射机制,通过方法名获取activity中定义方法
- 然后将方法委托给视图组件去执行。
看完之后,是不是就比较清晰了,实际上就是运用了Java的反射机制。
也了解了,为什么在视图中设置android:OnClick会带来一定程序上的效率损失。
通过格这段代码,我们应该了解到
1、View是如何加载布局文件并设置属性的
2、Java反射机制
3、相比SetOnClickListener,android:OnClick会损失一定的效率