天天看點

kotlin自定義項目中公用View     可換行的AutoBreakViewGroup擴充

        随着kotlin的推廣,越來越多的kotlin文檔可以在網上看到,今天就為大家分享一個基本的kotlin自定義view,首先Android studio配置kotlin的開發環境我就不細說了,因為網上類似這種文章太多了,随便一篇都可以幫你搞定。

        開發中對于一些經常用到的控件,都可以考慮封裝成一個基本的view,然後在使用的時候直接使用,不需要再一個個控件的組裝,不僅節省了開發的時間,代碼看起來也會更調理些,下面分享一下我平常封裝view的方法,其實在我的第一篇部落格裡已經有使用,那個自定義的OperateView就是一個View的封裝,在那塊的使用時為了後續的邏輯處理友善,今天用kotlin的形式來簡單封裝一下公用View。如果沒有看過OperateView的童鞋,可以抽時間看看

kotlin自定義項目中公用View     可換行的AutoBreakViewGroup擴充

     可換行的AutoBreakViewGroup擴充

         下面直接上代碼:

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import kotlinx.android.synthetic.main.view_add_delete.view.*


/**
 * Created by bobo on 2017/11/29.
 */
open class AddAndDeleteView(context: Context) : FrameLayout(context) {
    init {
        init(context)
    }

    constructor(context: Context,attributes: AttributeSet):this(context){
        init(context,attributes)
    }
    fun init(context: Context,attributes: AttributeSet?=null){
        LayoutInflater.from(context).inflate(R.layout.view_add_delete,this,true)
        initEvent()
    }
    fun initEvent(){
        bt_add.setOnClickListener{
            if(miClickCallBack!=null){
                miClickCallBack.add()
            }
        }
        bt_delete.setOnClickListener{
            if(miClickCallBack!=null){
                miClickCallBack.delete()
            }
        }
    }
    lateinit var miClickCallBack:IClickCallBack
    fun initICallBack(iClickCallBack:IClickCallBack){
        miClickCallBack=iClickCallBack
    }
    interface IClickCallBack{
        fun add()
        fun delete()
    }
}      

        首先自定義一個View然後繼承于FrameLayout,構造方法的選擇:一般在代碼中使用的話,我是隻重寫第一個構造方法,但是如果在xml布局中寫的話必須要重寫第二個構造方法。如果沒有重寫的話會報一個android.view.InflateException錯誤,當你看到這個錯誤的時候說明就是你xml布局出錯了。因為安卓系統解析xml檔案的時候,會預設調用第二個構造方法。切記,切記,切記重要的事情說三遍。

        kotlin中可以省去findViewById方法的關鍵代碼import kotlinx.android.synthetic.main.你的布局檔案名.*,然後在代碼中就不用在寫無聊的findViewById()方法,直接控件id.就可以調用。 這個确實比以前的java友善了不少。另外對于bt_add.setOnClickListener{}這種寫法,其實是一種叫Lambda表達式和擴充函數結合的寫法,如果感興趣大家也可以去學學,挺友善的。定義一個IClickCallBack接口是為了友善使用接口回調來處理一些自定義View中的點選事件處理邏輯。好了,整體的思路和代碼就是這些,最後再來個調用的代碼,就結束了,如果也有在使用kotlin開發的童鞋,可以和我一起讨論遇到的問題和難點,我也是新手,呵呵,期待一起進步

kotlin自定義項目中公用View     可換行的AutoBreakViewGroup擴充

bt_click.setOnClickListener{
    zdyView= object : AddAndDeleteView(this@TestActivity){}
    zdyView.initICallBack(object : AddAndDeleteView.IClickCallBack{
    override fun delete() {
        toast("您點選了删除")
    }

        override fun add(){
            toast("您點選了添加")
        }
})
    container.addView(zdyView)

}      

          一個簡單的點選事件,然後執行個體化自定義的view,執行個體化接口對象,實作裡面的方法,處理邏輯。完成