Kotlin Android Extensions使用指南

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使用指南

猜你喜欢

转载自blog.csdn.net/nongminkouhao/article/details/108225906