Kotlin Android Extensions使用指南
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使用指南相关推荐
- kotlin学习笔记——Kotlin Android Extensions
Kotlin Android Extensions是另外一个团队开发的,它是一个插件所以不需要依赖别的库.当前仅仅包含view的绑定,会自动创建很多属性让我们直接访问xml中的view,我们就不需要明 ...
- 【译】迁移被废弃的Kotlin Android Extensions插件
原文:Migrating the deprecated Kotlin Android Extensions compiler plugin 作者:Ahmad El-Melegy 在Kotlin 1.4 ...
- kotlin android 4,Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04)
时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1.1.4版本 发布后,原作者依据 K ...
- Android KTX与Kotlin Android Extensions
Android KTX Android KTX是Google官方推荐的一套便利的Android API扩展函数库.因还处于beta阶段,相关API并不丰富,但既然是出自JakeWharton大神之手, ...
- 迁移废弃的Kotlin Android Extensions插件
1.视图绑定 删除: apply plugin: 'kotlin-android-extensions' 使用: android {...buildFeatures {viewBinding true ...
- KTX 和 Kotlin android extension 都到底是个啥?
1. KTX是什么 Android官网对于KTX的介绍:https://developer.android.com/kotlin/ktx KTX 是被称为Android之光的 JakeWharton ...
- Android KTX 和 Kotlin android extension对比
参考: KTX 和 Kotlin android extension 都到底是个啥? Android KTX KTX 是被称为Android之光的 JakeWharton 写的 Android KTX ...
- Android避坑指南,Gson与Kotlin碰撞出一个不安全的操作
本文已经授权「鸿洋」公众号原创首发. 最近发现微信多了个专辑功能,可以把一系列的原创文章聚合,刚好我每周都会遇到很多同学问我各种各样的问题,部分问题还是比较有意义的,我会在周末详细的写demo验证,简 ...
- android 小插件开发,Android Gradle 插件开发指南
原标题:Android Gradle 插件开发指南 2018安卓巴士全球开发者论坛-成都站 安卓巴士全球开发者论坛成都站即将开启! 作为Android开发者,你可能见过无数个apply plugin: ...
最新文章
- GAN作用——在我做安全的看来,就是做数据拟合、数据增强
- IIC总线的原理与Verilog实现
- (GitHub标星6.9k)超详细的人工智能专家路线图,
- 打造自己的LinqProvider
- win10无法连接到这个网络_电脑无法连接网络怎么办?(有线网络篇)
- Logtail从入门到精通(四):正则表达式Java日志采集实战
- python 表示图论_Python 图论工具 | 学步园
- Django(三)模板
- 4.01~ios开发常用的宏
- power bi dax_M语言和Power BI中的DAX之间的差异
- 无线接入回传一体化关键技术及标准化进展
- 矩阵分解 三角分解(LU分解)
- 机器学习库sklearn之怎么划分训练集和测试集
- 植物突变体库(二)——EMS诱变
- 第二课 小企鹅迷宫探宝
- 数字IC面试高频考点之跨时钟域信号处理
- 什么是ITSM Master?
- firewalld防火墙配置IP伪装和端口转发
- uniapp获取微信头像和昵称
- [C++潜心修炼] 小试牛刀