Kotlin Android Extensions使用指南

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

几种绑定视图方式对比app

  • 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,不但要引入它的编译插件和库文件,在绑定视图的过程当中,依然须要定义成员变量,代码量并无减小。ide

  • 第三种,插件绑定视图(Kotlin-Android-Extensions)

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

apply plugin: 'kotlin-android-extensions'

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

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

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

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()
        }
    }
}

引入文件详细说明this

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()
        }
    }
}


做者:雷宇_
连接:http://www.imooc.com/article/21913
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合做指针

相关文章
相关标签/搜索