天天看点

自定义ViewGroup使用Databinding报错

个人在使用MVVM框架过程中,遇到一个难搞的问题,记录下。

自己封装了一个viewGroup方便自己用,viewGroup使用xml自定义属性,viewGroup包含一个textView和一个EditText,viewGroup的布局图不使用databinding,只有使用viewGroup的布局中使用Databinding。

期间遇到几个问题。

1:set报错,这个时因为使用databinding需要调用set方法,kotlin 自带的不是我们使用的,所以在viewGroup重新设置一个set属性方法

2:报错 a null object reference at androidx.databinding.MergedDataBinderMapper.getDataBinder,

发生这个错真的时一脸懵逼,各种百度,google,都没有找到合适的答案。直接原因是view.setTag(null),

这里tag为null,尝试了在viewGroup布局中引入databinding(加layout标签),然后再init方法中设置databinding,并使用DataBindingUtil.bind(view),同时手动设置tag,发现运行还是崩溃。然后换个思路:既然官方没有特殊说明自定义viewGroup在被调用的时候有特殊强调,那说明不是调用出错,那只可能是自定义ViewGroup的创建过程中出错了。然后发现自己的viewGroup初始构造函数中只包含一个context参数。尝试着把attrSet、detStyle等参数加进去。再次运行发行成功了。所以注意viewGroup的初始构造函数,尽量把attrset属性带上。

以下是构造函数代码:

//初始构造函数带上attributeSet
class TextInputView(context: Context,attributeSet: AttributeSet,defStyle:Int):RelativeLayout(context,attributeSet,defStyle) {
    lateinit var mContext :Context
    private var titleText:String?=null
    private var titleTextColor:Int?=null
    private var titleTextSize:Float?=null
    private var contentText:String?=null
    private var contentTextColor:Int?=null
    private var contentTextSize:Float?=null
    private var hintText:String?=null
    private var nextVisibility = false


    constructor(context: Context,attributeSet: AttributeSet):this(context,attributeSet,0){
        mContext = context
        initAttr(attributeSet)
        initView()
    }
    init {
        mContext = context
        initAttr(attributeSet)
        initView()
    }
           
//单独设置set函数
    fun setTitleTextColor(titleTextColor:Int){
        tv_title!!.setTextColor(titleTextColor)
    }

    fun setTitleTextSize(size:Float){
        tv_title!!.textSize = size
    }

    fun setContentText(text:String?){
        et_content!!.setText(text)
    }

    fun setContentTextColor(color:Int){
        et_content!!.setTextColor(color)
    }

    fun setContentTextSize(size:Float){
        et_content!!.textSize = size
    }