kotlin – 如何合成属性初始化视图?
我在我的代码合成属性。但想知道如何以及何时实际初始化在Android中的每个视图。
我们只需提供导入并通过其id来访问每个视图。 当它为视图对象分配内存?
这很容易通过反编译一个Kotlin文件来调查你使用Kotlin Android扩展。 (你可以通过转到Tools -> Kotlin -> Show Kotlin Bytecode
,然后在出现的窗格中选择Decompile
来实现。)简而言之,它没有什么神奇之处,它只是使用findViewById
,然后将View
转换为具体的类型。
如果你在一个Activity
或Fragment
使用它,它们会被缓存到一个Map
这样查找只会出现一次。 之后,您只需支付以ID作为密钥获取地图条目的费用。
你也可以在ViewGroup
上使用它来查找一个具有给定ID的孩子,在这种情况下,没有缓存,这些调用被每次到达该行时发生的简单的findViewById
调用所取代。 这第二个语法看起来像这样:
val view = inflater.inflate(...) view.btnLogin.text = "Login"
在字节码中它会翻译成类似于这个的东西:
View view = inflater.inflate(...); Button btnLogin = (Button) view.findViewById(R.id.btnLogin); btnLogin.setText("Login");
请注意,实际的View
实例仍然在布局膨胀时创建。 Kotlin Android扩展只是通过findViewById
调用的语法糖。