
原生页面的开发有一个让人头疼的地方:页面中控件非常多,堆砌了大量的控件声明与控件绑定代码。很明显,这属于我们想要避免的重复劳动。
而正好,Kotlin给我们提供了一个解决方法,kotlin-android-extensions,在app/build.gradle中加入下面两句即可:
apply plugin: 'kotlin-androID'
apply plugin: 'kotlin-android-extensions'
引入了kotlin-android-extensions后,控件的使用就变得非常简洁了,在代码中直接使用xml中定义的控件名即可。
接下来要思考的问题是,为什么可以直接使用控件名去 *** 作控件,而不用再显式地使用findVIEwByID。
我们可以反编译Kotlin代码,查看其对应的Java代码来一探究竟:
首先在AndroID Studio中,点击顶部的Tools -> Kotlin,然后选择Show Kotlin Bytecode,这样在右侧就打开了Koltin代码对应的字节码,接下来,点击字节码界面左上方的Decompile,就得到了Kotlin代码对应的Java代码。
可以看到,et_account控件 *** 作对应的代码是:
我们再看一下这个findCachedVIEwByID方法:
可以看到,在这个方法里有一个名为findVIEwCache的HashMap,用来缓存每次找到的VIEw,避免每次对VIEw进行 *** 作时都重新调用findVIEwByID方法,是的,在这里,仍然是通过findVIEwByID去获取控件的,而且每个控件的第一次使用都会调用findVIEwByID方法,后续的使用可以在findVIEwCache中去获取。
另外一个需要注意的地方是,在Fragment中使用时,需要注意不能在onCreateVIEw中直接使用控件,否则会crash,应该在onVIEwCreated中去使用,具体的原因如下:
可以看到,fragment对应的findCachedVIEwByID方法与activity对应的有所不同,它需要先调用getVIEw方法,然后再通过getVIEw返回的值去findVIEwByID,那么getVIEw方法的返回值其实是mVIEw,也就是fragment的根vIEw:
继续看一下mVIEw的赋值时机:
可以看到mVIEw其实就是onCreateVIEw的返回值,所以我们不能在onCreateVIEw中去直接 *** 作控件。
总结以上是内存溢出为你收集整理的Kotlinx不使用findViewById的原理全部内容,希望文章能够帮你解决Kotlinx不使用findViewById的原理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)