Kotlin Android View Binding:findViewById vs Butterknife vs Kotlin Android Extension

tri*_*iad 22 android findviewbyid kotlin butterknife kotlin-android-extensions

我正试图找出在Kotlin中进行Android View Binding的最佳方法.似乎有一些选择:

findViewById

val button: Button by lazy { findViewById<Button>(R.id.button) }
Run Code Online (Sandbox Code Playgroud)

牛油刀

https://github.com/JakeWharton/butterknife

@BindView(R.id.button) lateinit var button: Button
Run Code Online (Sandbox Code Playgroud)

Kotlin Android扩展程序

https://kotlinlang.org/docs/tutorials/android-plugin.html

import kotlinx.android.synthetic.main.activity_main.*
Run Code Online (Sandbox Code Playgroud)

我对java版本中的findViewById和Butterknife非常熟悉,但Kotlin中每种视图绑定方法的优缺点是什么?

Kotlin Android扩展程序与RecyclerView + ViewHolder模式相匹配吗?

另外,Kotlin Android Extensions如何处理嵌套视图的视图绑定include

例如:对于使用的活动activity_main.xml,将如何View custom1访问?

activity_main.xml中

<...>
    <include layout="@layout/custom" android:id="@+id/custom" />
</>
Run Code Online (Sandbox Code Playgroud)

custom.xml

<...>
    <View android:id="@+id/custom1" ... />
    <View android:id="@+id/custom2" ... />
</>
Run Code Online (Sandbox Code Playgroud)

Rvb*_*b84 16

在 Android 中有很多访问视图的方法。快速概览:

在此处输入图片说明

我的建议是:

  1. findViewById:老派。避免。
  2. ButterKnife:老派,但更少的样板和一些附加功能。仍然缺乏编译时安全性。尽量避免。
  3. Kotlin Synthetic:真是一个优雅的 findViewbyId 缓存版本。更好的性能和更少的样板,但仍然没有编译时安全。如果不需要编译时安全,则是最佳选择。
  4. ViewBinding:介于选项 1-3 和数据绑定之间。但缺乏强大的数据绑定选项(如 2 路数据绑定和在 XML 文件中使用变量)。
  5. 数据绑定:最强大的选项。与 LiveData 和 ViewModels (JetPack) 集成非常好,以创建反应式 UI(类似于 RxJava)。可以减慢大型项目/用户界面的构建时间(像 ButterKnife 一样使用注释处理器)。我的个人喜好。

另见:https : //www.youtube.com/watch?v=Qxj2eBmXLHg

有趣的是,Jake Wharton(ButterKnife 的原作者)现在已经加入 Google 并致力于 ViewBinding。


cha*_*l03 14

kotlin-android-extensions更好Kotlin.ButterKnife也很好,但kotlin-android-extensions在这里是一个更好,更明智的选择.

原因:Kotlin使用synthetic属性和那些按需调用caching function(因此轻微的快速活动/片段加载),同时一次ButterKnife绑定所有视图ButterKnife.bind()(消耗更多的时间).随着Kotlin你甚至不需要使用注释绑定的意见.

是的它也可以与RecyclerView + ViewHolder模式一起使用,你只需要导入kotlinx.android.synthetic.main.layout_main.view.*(如果layout_main.xml是Activity/Fragment布局文件名).

您无需为使用导入的布局做任何额外的工作include.只需使用导入视图的ID即可.

请查看以下官方文档说明:

Kotlin Android Extensions是Kotlin编译器的插件,它做了两件事:

  1. 在每个Kotlin Activity中添加隐藏的缓存功能和字段.该方法非常小,因此它不会增加APK的大小.
  2. 用函数调用替换每个合成属性调用.

    这是如何工作的,当调用合成属性时,接收器是模块源中的Kotlin Activity/Fragment类,调用缓存函数.例如,给定

class MyActivity : Activity()
fun MyActivity.a() { 
    this.textView.setText(“”)
}
Run Code Online (Sandbox Code Playgroud)

在MyActivity中生成隐藏的缓存函数,因此我们可以使用缓存机制.

但是在以下情况中:

fun Activity.b() { 
    this.textView.setText(“”)
}
Run Code Online (Sandbox Code Playgroud)

我们不知道是否仅在来自我们的源的活动或普通Java活动上调用此函数.因此,我们不在那里使用缓存,即使前一个示例中的MyActivity实例是接收器.

链接到上面的文档页面

我希望它有所帮助.


zsm*_*b13 4

我不能将此问题标记为重复问题,因为您所问的多个问题已在不同问题下得到回答/讨论。

Kotlin 中每种视图绑定方法的优缺点是什么?

这已经在这里讨论过。

Kotlin Android 扩展如何通过 include 处理嵌套视图的视图绑定?例如:对于使用activity_main.xml的活动,如何访问View custom1?

Kotlin Android 扩展所做的一切都在findViewById为您服务。看这里

Kotlin Android 扩展与 RecyclerView + ViewHolder 模式配合得很好吗?

是的,它确实。但是,您必须将从其中获取的视图保存到属性中,因为它们没有像“活动”或“片段”那样的缓存。看这里


如果您仍有未解答的问题,请随时要求澄清。