一、问题
最近在自定view时候,遇到一个问题,view本身没有错误,app运行起来界面也很正常,但在xml编写引入自定view时,导致整个布局不能预览
下面是我写的代码
class CustomTitleBarView (context: Context?, attrs: AttributeSet?) :
RelativeLayout(context, attrs, 0), LifecycleEventObserver {
private val layoutBack: RelativeLayout by lazy { findViewById<RelativeLayout>(R.id.layout_back) }
private val ivBack: ImageView by lazy { findViewById<ImageView>(R.id.iv_back) }
private val ivHeat: ImageView by lazy { findViewById<ImageView>(R.id.iv_heat) }
private val tvHeart: TextView by lazy { findViewById<TextView>(R.id.tv_heart) }
private val ivGold: ImageView by lazy { findViewById<ImageView>(R.id.iv_gold) }
private val tvGold: TextView by lazy { findViewById<TextView>(R.id.tv_gold) }
private val ivHome: ImageView by lazy { findViewById<ImageView>(R.id.iv_home) }
//点击个人信息
var clickHomeInfoListener: () -> Unit = {
}
//点击返回
var clickBackListener: () -> Unit ={
}
init {
LayoutInflater.from(context).inflate(R.layout.custom_title_bar, this)
val typedArray = context?.obtainStyledAttributes(attrs, R.styleable.CustomTitleBarView)
val leftDrawable = typedArray?.getDrawable(R.styleable.CustomTitleBarView_bar_left_drawable)
val rightDrawable = typedArray?.getDrawable(R.styleable.CustomTitleBarView_bar_right_drawable)
typedArray?.recycle()
if (leftDrawable != null){
ivBack.setImageDrawable(leftDrawable)
layoutBack.visibility = View.VISIBLE
}else{
layoutBack.visibility = View.GONE
}
if (rightDrawable != null){
ivHome.setImageDrawable(rightDrawable)
ivHome.visibility = View.VISIBLE
}else{
ivHome.visibility = View.GONE
}
refreshData()
clickListener()
TitleBarHelper.putView(this.hashCode(),this)
(context as AppCompatActivity).lifecycle.addObserver(this)
}
private fun clickListener(){
ivHome.setOnClickListener {
UserInfoActivity.startAction(context as Activity)
}
layoutBack.setOnClickListener {
(context as Activity).finish()
}
}
/**
* 动态设置用户红心和金币
*/
fun setGoldData(heart: String?,gold: String?){
if (heart == null || gold == null){
return
}
GoldConfig.gold = gold
GoldConfig.heart = heart
refreshData()
}
fun refreshData(){
tvHeart.text = GoldConfig.heart
tvGold.text = GoldConfig.gold
}
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when(event){
Lifecycle.Event.ON_DESTROY ->{
TitleBarHelper.removeView(this.hashCode())
}
else -> {
}
}
}
}
二、原因
具体是下面这个方法在init初始化调用,导致不能在xml里面预览,但本身代码可以运行,不会出错。网上查阅资料,是这部分逻辑需要设备支持(俺很懵),在xml中就无法预览。
(context as AppCompatActivity).lifecycle.addObserver(this)
三、解决方法
解决也简单,使用isInEditMode()做下判断,如果是预览,直接不执行
if (!isInEditMode){
(context as AppCompatActivity).lifecycle.addObserver(this)
}