Kotlin Android Extensions是Kotlin团队开发的一个插件,目的是让我们在开发过程中更少的编写代码。目前包括了视图绑定的功能。

几种绑定视图方式对比**

xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"android:gravity="center"><Buttonandroid:id="@+id/btn_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录"/>
</LinearLayout>

第一种,传统方式绑定视图(findViewById)

private lateinit var mLoginBtn:Buttonoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)mLoginBtn = findViewById(R.id.btn_login) as ButtonmLoginBtn.setOnClickListener {Toast.makeText(this@MainActivity,"登录",Toast.LENGTH_SHORT).show()}}

在这种方式里面,一般情况下我们会定义一个成员变量来接收视图,同时使用findViewById并做一次类型转换。

第二种,框架注解绑定视图(ButterKnife)

/*引入编译插件和依赖包。略过...*/@BindView(R.id.btn_login)lateinit var mLoginBtn:Buttonoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)ButterKnife.bind(this)mLoginBtn.setOnClickListener {Toast.makeText(this@MainActivity,"登录",Toast.LENGTH_SHORT).show()}}

可以看到,使用ButterKnife,不但要引入它的编译插件和库文件,在绑定视图的过程中,依然需要定义成员变量,代码量并没有减少。

第三种,插件绑定视图(JetBrains公司的Kotlin-Android-Extensions)

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

apply plugin: 'kotlin-android-extensions'

2)在需要绑定视图的Activity、Fragment、Adapter及自定义View中引入资源文件

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

3) 在使用的位置,直接使用xml中对应的id访问视图,完整代码如下:

import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)btn_login.setOnClickListener {Toast.makeText(this@MainActivity,"登录",Toast.LENGTH_SHORT).show()}}
}
引入文件详细说明
import kotlinx.android.synthetic.main.activity_main.*

固定前缀:import kotlinx.android.synthetic.main
布局文件名称:activity_main
需要引入的视图:“”表示引入布局下所有视图;当然,也可以只引入需要的视图,把换成对应的id就行啦,如下:

import kotlinx.android.synthetic.main.activity_main.btn_login

在Adapter和自定义View中引入,需要在布局文件名后添加view节点,如下:

import kotlinx.android.synthetic.main.view_login.view.*
Kotlin插件绑定视图范围

在Activity中使用,引入资源文件,直接使用id访问视图

import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)btn_login.setOnClickListener {Toast.makeText(this@MainActivity,"登录",Toast.LENGTH_SHORT).show()}}
}

在Fragment中使用,引入资源文件,直接使用id访问视图有一点特别注意:在onCreateView中不直接访问视图,因为视图没有加载完成,容易引起空指针,需要在onViewCreated中访问视图,代码如下:

import kotlinx.android.synthetic.main.view_login.*class LoginFragment:Fragment() {override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {super.onCreateView(inflater, container, savedInstanceState)return inflater?.inflate(R.layout.view_login, container, false)}override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)btn_login.setOnClickListener {Toast.makeText(context,"登录", Toast.LENGTH_SHORT).show()}}
}

在Adapter中使用,引入布局文件需要添加view节点,可使用ViewHolder中的itemView直接访问视图(当然,也可以在ViewHolder中做一次视图绑定,与传统ViewHolder类似),代码如下:

import kotlinx.android.synthetic.main.view_login.view.*class LoginAdapter(var context: Context):RecyclerView.Adapter<LoginAdapter.ViewHolder>() {override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {val view = LayoutInflater.from(context).inflate(R.layout.view_login,parent,false)return ViewHolder(view)}override fun onBindViewHolder(holder: ViewHolder, position: Int) {holder.itemView.btn_login.setOnClickListener {Toast.makeText(context,"登录", Toast.LENGTH_SHORT).show()}}override fun getItemCount(): Int {return 3}class ViewHolder(view: View) : RecyclerView.ViewHolder(view)
}

在自定义View中使用,引入布局文件需要添加view节点,在自定义视图中,可直接使用id访问视图,代码如下:

import kotlinx.android.synthetic.main.view_login.view.*class LoginView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {init {View.inflate(context,R.layout.view_login,this)btn_login.setOnClickListener {Toast.makeText(context,"登录", Toast.LENGTH_SHORT).show()}}
}

第四种,google 的viewBinding

参考官方文档

如何选择参考:谁才是ButterKnife的终结者?ViewBinding与Kotlin-android-extension的选择

转自:Kotlin Android Extensions使用指南

Kotlin Android Extensions使用指南相关推荐

  1. kotlin学习笔记——Kotlin Android Extensions

    Kotlin Android Extensions是另外一个团队开发的,它是一个插件所以不需要依赖别的库.当前仅仅包含view的绑定,会自动创建很多属性让我们直接访问xml中的view,我们就不需要明 ...

  2. 【译】迁移被废弃的Kotlin Android Extensions插件

    原文:Migrating the deprecated Kotlin Android Extensions compiler plugin 作者:Ahmad El-Melegy 在Kotlin 1.4 ...

  3. kotlin android 4,Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04)

    时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1.1.4版本 发布后,原作者依据 K ...

  4. Android KTX与Kotlin Android Extensions

    Android KTX Android KTX是Google官方推荐的一套便利的Android API扩展函数库.因还处于beta阶段,相关API并不丰富,但既然是出自JakeWharton大神之手, ...

  5. 迁移废弃的Kotlin Android Extensions插件

    1.视图绑定 删除: apply plugin: 'kotlin-android-extensions' 使用: android {...buildFeatures {viewBinding true ...

  6. KTX 和 Kotlin android extension 都到底是个啥?

    1. KTX是什么 Android官网对于KTX的介绍:https://developer.android.com/kotlin/ktx KTX 是被称为Android之光的 JakeWharton  ...

  7. Android KTX 和 Kotlin android extension对比

    参考: KTX 和 Kotlin android extension 都到底是个啥? Android KTX KTX 是被称为Android之光的 JakeWharton 写的 Android KTX ...

  8. Android避坑指南,Gson与Kotlin碰撞出一个不安全的操作

    本文已经授权「鸿洋」公众号原创首发. 最近发现微信多了个专辑功能,可以把一系列的原创文章聚合,刚好我每周都会遇到很多同学问我各种各样的问题,部分问题还是比较有意义的,我会在周末详细的写demo验证,简 ...

  9. android 小插件开发,Android Gradle 插件开发指南

    原标题:Android Gradle 插件开发指南 2018安卓巴士全球开发者论坛-成都站 安卓巴士全球开发者论坛成都站即将开启! 作为Android开发者,你可能见过无数个apply plugin: ...

最新文章

  1. GAN作用——在我做安全的看来,就是做数据拟合、数据增强
  2. IIC总线的原理与Verilog实现
  3. (GitHub标星6.9k)超详细的人工智能专家路线图,
  4. 打造自己的LinqProvider
  5. win10无法连接到这个网络_电脑无法连接网络怎么办?(有线网络篇)
  6. Logtail从入门到精通(四):正则表达式Java日志采集实战
  7. python 表示图论_Python 图论工具 | 学步园
  8. Django(三)模板
  9. 4.01~ios开发常用的宏
  10. power bi dax_M语言和Power BI中的DAX之间的差异
  11. 无线接入回传一体化关键技术及标准化进展
  12. 矩阵分解 三角分解(LU分解)
  13. 机器学习库sklearn之怎么划分训练集和测试集
  14. 植物突变体库(二)——EMS诱变
  15. 第二课 小企鹅迷宫探宝
  16. 数字IC面试高频考点之跨时钟域信号处理
  17. 什么是ITSM Master?
  18. firewalld防火墙配置IP伪装和端口转发
  19. uniapp获取微信头像和昵称
  20. [C++潜心修炼] 小试牛刀

热门文章

  1. ASP.NET 模拟测试001-100题
  2. JS设置COOKIE,PHP中处理
  3. 正则表达式 \\w \\s \\d \\b
  4. css-标准盒子与怪异盒子
  5. 我用 Python 代码爬取“学习”了全网各种风格妹子1T的小图片
  6. (jsp/html)网页上嵌入播放器
  7. 【附源码例】快捷指令实现调出iOS隐藏应用程序-原理解析
  8. 一款集成度高的渗透工具:Railgun
  9. OpenCV+VTK 读书笔记
  10. ----down----