kotlin – 如何合成属性初始化视图?

我在我的代码合成属性。但想知道如何以及何时实际初始化在Android中的每个视图。

我们只需提供导入并通过其id来访问每个视图。 当它为视图对象分配内存?

这很容易通过反编译一个Kotlin文件来调查你使用Kotlin Android扩展。 (你可以通过转到Tools -> Kotlin -> Show Kotlin Bytecode ,然后在出现的窗格中选择Decompile来实现。)简而言之,它没有什么神奇之处,它只是使用findViewById ,然后将View转换为具体的类型。

如果你在一个ActivityFragment使用它,它们会被缓存到一个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调用的语法糖。