个人在使用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
}