Kotlin学习之旅(D9)-Android Extensions

Kotlin学习之旅第九天

今天的主题是 - -Android Extensions

前言

Kotlin学习之旅(D1)-学习计划&基本语法

Kotlin学习之旅(D2)-基本语法

Kotlin学习之旅(D3)-类与继承

Kotlin学习之旅(D4)-函数与Lambda表达式

Kotlin学习之旅(D5)-高级语法

Kotlin学习之旅(D6)-Kotlin Idioms part 1

Kotlin学习之旅(D7)-Kotlin Idioms part 2

Kotlin学习之旅(D8)-From Java to Kotlin

Android Extensions 是什么

Kotlin Android Extensions 是 Kotlin 团队开发的一个插件,目的是让我们在开发过程中可以减少代码的编写量。主要的功能就是:视图绑定

在Java中,我们经常要写的一句代码就是 findViewById(),但是在一个Layou有许多View存在的情况下,重复写这句代码不仅工作量大,而且可读性差,因此各路大神发挥智慧,推出了许多的第三方库,其中最著名的就是ButterKnife了 ,但是使用ButterKnife有个不好的地方,就是需要定义成员变量,代码量和原生的方式差不多。

现在 Kotlin Android Extensions 能够提供与这些开源库功能相同的体验,并且不需要添加任何额外代码。

Android Extensions 怎么用

1.在Moudle中的build.gradle文件添加插件配置

apply plugin: 'kotlin-android-extensions'

2. 在View中引入资源文件

import kotlinx.android.synthetic.main.activity_main.*

3.访问id

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
		// 1
        btn_login.setOnClickListener {
            Toast.makeText(this@MainActivity,"Android Extensions test",Toast.LENGTH_SHORT).show()
        }
    }
}
  1. 通过btn_login.setXXX 的方式来访问view,并且调用view相关方法,不需要写findViewById()

import格式

import格式是这样的:kotlinx.android.synthetic.main.布局名称.*。需要注意的是include进来的布局,也是需要通过import导入相应布局,这样才能正常使用。

ViewHolder 使用Extensions

刚开始的时候Extensions是不支持在ViewHolder中使用视图绑定的,因此还是需要些findViewById,但是从Kotlin 1.1.4起,Extensions加入了增强功能,由于这项功能还未正式发布,因此需要开启实验标志

####1.开启experimental

在Module的build.gradle文件中设置:

androidExtensions {
    experimental = true
}

2.编写ViewHolder

import android.support.v7.widget.RecyclerView
import android.view.View
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_main.*

class ViewHolder constructor(override val containerView: View?)
    : RecyclerView.ViewHolder(containerView),
      LayoutContainer {   // 1

    fun setContent(str: String) {
        helloTv.text = str   // 2
    }
}
  1. 实现LayoutContainer
  2. 使用helloTv.text

3. 什么是LayoutContainer

在Activity,Fragment,View中我们知道import对应的layout就可以了,但是像ViewHolder这些特殊的,我们就需要通过实现LayoutContainer接口,接口返回一个containerView,按照字面意思理解就是内容视图,这个containerView就包含了ViewHolder里面的所有子View,因此可以直接使用view.setxxx / view.property 的写法

Android多渠道版本

Android Extensions 插件支持Android 多渠道版本,假如在你的build.gradle中有一个名为free的版本

android {
    productFlavors {
        free {
            versionName "1.0-free"
        }
    }
}

然后你就可以通过如下方式导入针对free/res/layout/activity_free.xml的所有生成的属性。

import kotlinx.android.synthetic.free.activity_free.*

内部原理

Kotlin Android Extensions 是一个Kotlin编译器插件。它执行下面两个操作:

  1. 为每一个Kotlin Activity添加一个隐藏的缓存方法和一个域。这个方法相当之小,基本不会增加APK 的大小。
  2. 用方法调用替换每一个属性调用。

例如:

class MyActivity: Activity()
fun MyActivity.a() { 
        this.textView.setText(“”) 
}

总结

Kotlin Android Extensions 的主要功能其实就是视图绑定,但是这一个功能也可以减少许多重复代码的编写,因此有机会还是把这个插件用上吧~

Day 9 - Learn Kotlin Trip, Completed.


你可能感兴趣的:(kotlin)