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
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做指針

相關文章
相關標籤/搜索