-2

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

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

4

1 回答 1

4

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

如果您在 anActivity或 a中使用它Fragment,它们会被缓存在 aMap中,以便查找只发生一次。之后,您只需支付通过 ID 作为键获取地图条目的成本。


您还可以在 a 上使用它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 Extensions 只是findViewById调用的语法糖。

于 2017-07-13T08:11:22.207 回答