package com.example.smart.widget.common import android.content.Context import android.text.Editable import android.text.TextUtils import android.util.AttributeSet import android.view.LayoutInflater import android.widget.FrameLayout import androidx.core.view.isVisible import com.example.basecore.util.DateUtils import com.example.basecore.util.dp2px import com.example.basecore.widget.SimpleTextWatcher import com.example.smart.R import com.example.smart.bean.CommonOptionsBean import com.example.smart.bean.ValueIssueBean import com.example.smart.databinding.CommonEditLayoitBinding import com.example.smart.enumlist.PropertyItemType import com.example.smart.ui.options.device.bean.DeviceUsageBean import com.example.smart.widget.dialog.CommonPopupWindow import com.example.smart.widget.dialog.PopupHelper import com.loper7.date_time_picker.dialog.CardDatePickerDialog /** * 通用输入框 */ class CommonInputWidget @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, ) : FrameLayout(context, attrs, defStyleAttr), ICommonDataProvider { private var mDataEvent: ICommonDataEvent? = null private var mDataList: List? = null private var id: String = "" private var content: String = "" private val mPopupHelper by lazy { PopupHelper() } private var isEditEnable = false companion object { fun create(context: Context) = CommonInputWidget(context) } private val binding by lazy(LazyThreadSafetyMode.NONE) { CommonEditLayoitBinding.bind(this) } init { LayoutInflater.from(context).inflate(R.layout.common_edit_layoit, this) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CommonInputWidget) val title = typedArray.getString(R.styleable.CommonInputWidget_prefix_txt) val contentTxt = typedArray.getString(R.styleable.CommonInputWidget_content_txt) val isMust = typedArray.getBoolean(R.styleable.CommonInputWidget_is_must, false) isEditEnable = typedArray.getBoolean(R.styleable.CommonInputWidget_is_edit, false) val showMore = typedArray.getBoolean(R.styleable.CommonInputWidget_show_more, true) val hinTxt = typedArray.getString(R.styleable.CommonInputWidget_hint_txt) typedArray.recycle() binding.apply { titleTv.text = title if (!TextUtils.isEmpty(contentTxt)) { contentTv.text = contentTxt content = contentTxt!! } if (!TextUtils.isEmpty(hinTxt)) { contentEdt.hint = hinTxt } setOperation(isMust, isEditEnable, showMore) } if (showMore) { binding.contentTv.setOnClickListener { if (mDataList.isNullOrEmpty()) { return@setOnClickListener } showMorePanel() } } } //不显示更多按钮但是拥有点击事件 fun setClickWithoutMore() { binding.contentTv.setOnClickListener { if (mDataList.isNullOrEmpty()) { return@setOnClickListener } showMorePanel() } } fun setOperation(isMust: Boolean, isEdit: Boolean, showMore: Boolean) { isEditEnable = isEdit binding.apply { if (isEditEnable) { contentEdt.isVisible = true contentTv.isVisible = false moreImg.isVisible = false } else { contentEdt.isVisible = false contentTv.isVisible = true moreImg.isVisible = true } contentEdt.addTextChangedListener(object : SimpleTextWatcher() { override fun afterTextChanged(s: Editable?) { content = s?.toString() ?: "" deviceUsageBean?.uploadContent = content } }) if (!showMore) { moreImg.isVisible = false contentTv.setPadding(dp2px(6), 0, dp2px(16), 0) } if (isMust) { titleTv.setTextColor(resources.getColor(R.color.common_text_point_color)) } else { titleTv.setTextColor(resources.getColor(R.color.gray_333333)) } } if (showMore) { binding.contentTv.setOnClickListener { if (mDataList.isNullOrEmpty()) { return@setOnClickListener } showMorePanel() } } } private var deviceUsageBean: DeviceUsageBean.DeviceSingleInfo ? = null /** * only called by usage type */ fun bindDeviceUsageInfo(bean: DeviceUsageBean.DeviceSingleInfo, isEdit: Boolean) { binding.titleTv.text = bean.name deviceUsageBean = bean if (isEdit) { if (TextUtils.isEmpty(deviceUsageBean?.uploadContent)) { binding.contentEdt.setText("") binding.contentEdt.hint = "请输入" } else { binding.contentEdt.setText(deviceUsageBean?.uploadContent) } } else { if (TextUtils.isEmpty(deviceUsageBean?.uploadContent)) { binding.contentTv.text = "请选择" } else { binding.contentTv.text = deviceUsageBean?.uploadContent } if (bean.type == PropertyItemType.ENUM) { val list = ArrayList() for (data in bean.options) { list.add(CommonOptionsBean(data, data)) } if (list.isNotEmpty()) { bean.uploadContent = list[0].name } bindData(list) if (!TextUtils.isEmpty(deviceUsageBean?.uploadContent)) { setDataById(deviceUsageBean?.uploadContent!!) } } binding.contentTv.setOnClickListener { if (bean.type == PropertyItemType.DATE) { showDatePicker() } else { showMorePanel() } } } } private fun showMorePanel() { mPopupHelper.showPopup(context, mDataList!!, object : CommonPopupWindow.ItemClickListener { override fun onItemClick(bean: CommonOptionsBean) { updateData(bean) mDataEvent?.onClickView(id) mDataEvent?.onWidgetPicked(id, content) deviceUsageBean?.uploadContent = content } }) } fun showDatePicker() { CardDatePickerDialog.builder(context) .setTitle("日期") .showBackNow(false) .setThemeColor(context.getColor(R.color.tab_select)) .setOnChoose(listener = object : CardDatePickerDialog.OnChooseListener { override fun onChoose(millisecond: Long) { val date = DateUtils.stampToDate(millisecond) binding.contentTv.text = date content = date mDataEvent?.onWidgetPicked("", date) deviceUsageBean?.uploadContent = content } }).build().show() } override fun getEdtView() = binding.contentEdt override fun getPreTxt(): String = binding.titleTv.text.toString() fun getContentView() = binding.contentTv fun setContentTxt(txt: String?) { binding.contentTv.text = txt content = txt ?: "" } /** * 下拉框内容,不能为空 */ fun setContentWithId(txt: String?, id: String?) { if (TextUtils.isEmpty(id)) { return } if (TextUtils.isEmpty(txt)) { return } binding.contentTv.text = txt content = txt!! this.id = id!! } fun setDataById(id: String) { if (TextUtils.isEmpty(id)) { return } if (mDataList.isNullOrEmpty()) { return } for (data in mDataList!!) { if (TextUtils.equals(id, data.code)) { updateData(data) break } } } fun getValueById(id: String): String { if (TextUtils.isEmpty(id)) { return "0" } if (mDataList.isNullOrEmpty()) { return "0" } for (data in mDataList!!) { if (data is ValueIssueBean) { if (TextUtils.equals(id, data.code)) { return data.value } } } return "0" } fun setEditTxt(txt: String?) { binding.contentEdt.setText(txt) content = txt ?: "" } fun clearTxt() { binding.contentTv.text = "" content = "" id = "" } override fun bindData(data: List) { mDataList = data if (data.isNotEmpty()) { updateData(data[0]) } } override fun setDataEvent(event: ICommonDataEvent) { this.mDataEvent = event } override fun updateData(data: CommonOptionsBean) { if (this.id == data.code) { return } this.id = data.code content = data.name if (isEditEnable) { binding.contentEdt.setText(content) } else { binding.contentTv.text = content } } override fun getContent(): String = content override fun getContainerId(): String = id }