Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
科特林';s的Android扩展和变量_Android_Kotlin - Fatal编程技术网

科特林';s的Android扩展和变量

科特林';s的Android扩展和变量,android,kotlin,Android,Kotlin,在Kotlin之前,Android开发人员应该将对活动视图的引用保存在如下变量中: Button fooBtn = (Button) findViewById(R.id.btn_foo) 减少锅炉板代码量和findViewById调用次数 通过引入,我们可以通过简单地使用以下按钮来参考相同的按钮: btn_foo 问题: btn\u foo是否对保存的按钮有引用,还是每次都调用findViewById 开发人员是否仍然假设使用变量来存储btn\u foo以提高应用程序的性能,或者直接在代码

在Kotlin之前,Android开发人员应该将对活动视图的引用保存在如下变量中:

Button fooBtn = (Button) findViewById(R.id.btn_foo)
减少锅炉板代码量和
findViewById
调用次数

通过引入,我们可以通过简单地使用以下按钮来参考相同的按钮:

btn_foo

问题:

  • btn\u foo
    是否对保存的按钮有引用,还是每次都调用
    findViewById
  • 开发人员是否仍然假设使用变量来存储
    btn\u foo
    以提高应用程序的性能,或者直接在代码中使用它


  • 编辑:有一些扩展是如何工作的,但是仍然有点不清楚。

    它是缓存的,所以不会在每次需要时调用
    findViewById
    。存储变量肯定不会提高应用程序的性能

    Kotlin Android Extension(KAE)的一位开发者证实:

    • KAE将在第一次调用后保留对视图的引用,而不是一直使用
      findViewById
      。这只对
      活动和
      片段有效

    • KAE不会缓存数据,每次对任何其他元素使用
      findViewById
      (除了
      活动
      /
      片段

    因此,如果要初始化一个
    ViewHolder

    class FooViewHolder(view: View): RecyclerView.ViewHolder(view) {
        fun bind(day: FooItem.Day) {
            btn_foo.text = day.title
        }
    }
    
    反编译为Java调用将如下所示:

    ((Button)this.itemView.findViewById(R.id.btn_foo)).setText((CharSequence)day.getTitle());
    
    这正是你想要避免的

    开发人员可能知道这一点



    结论:fill免费使用KAE,无需任何额外变量,但仅适用于您的
    活动
    /
    片段

    为什么仅限于
    活动
    片段
    ?这是因为他们可以轻松访问
    上下文
    ?@Tuby这可能与
    上下文
    ,以及Kotlin创建扩展函数的方式有关()。有一个GitHub PR解决了这个问题,并使它可以将KAE用于
    ViewHolder
    ()等元素。但是它现在已经停用一年了。而且,有了使用Google数据绑定库和MVVM模式的正确方法,就不需要
    findViewById
    。我个人正在等待体系结构组件变得稳定,因此它实现了数据绑定,之后我将移动我的项目以使用它。