Kotlin Android Extensions是Kotlin团队开发的一个插件,目的是让我们在开发过程中更少的编写代码。目前包括了视图绑定的功能。
几种绑定视图方式对比**
xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:gravity="center"
>
<Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
/>
</LinearLayout>
第一种,传统方式绑定视图(findViewById)
private lateinit var mLoginBtn:Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mLoginBtn = findViewById(R.id.btn_login) as Button
mLoginBtn.setOnClickListener {
Toast.makeText(this@MainActivity,"登录",Toast.LENGTH_SHORT).show()
}
}
在这种方式里面,一般情况下我们会定义一个成员变量来接收视图,同时使用findViewById并做一次类型转换。
第二种,框架注解绑定视图(ButterKnife)
/*
引入编译插件和依赖包。略过...
*/
@BindView(R.id.btn_login)
lateinit var mLoginBtn:Button
override 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使用指南
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6215.html