package com.gh.common.databind import android.os.Build import android.text.Editable import android.text.Html import android.text.TextWatcher import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.widget.EditText import android.widget.LinearLayout import android.widget.PopupWindow import androidx.core.content.ContextCompat import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.LinearLayoutManager import com.gh.gamecenter.common.callback.OnViewClickListener import com.gh.gamecenter.common.utils.dip2px import com.gh.gamecenter.common.utils.toDrawable import com.gh.gamecenter.common.view.BugFixedPopupWindow import com.gh.gamecenter.R import com.gh.gamecenter.databinding.KaifuAddItemBinding import com.gh.gamecenter.databinding.LayoutAddKaifuPopupBinding import com.gh.gamecenter.databinding.LayoutPopupContainerBinding import com.gh.gamecenter.entity.ServerCalendarEntity import com.gh.gamecenter.servers.add.AddKaiFuPopupAdapter import java.text.SimpleDateFormat import java.util.* object AddKaiFuBindingAdapter { private var popupWindow: BugFixedPopupWindow? = null @JvmStatic @BindingAdapter("addKaiFuView", "clickListener") fun addKaiFuView( view: LinearLayout, list: List?, listener: OnViewClickListener<*>? ) { if (list == null) return view.removeAllViews() view.addView(LayoutInflater.from(view.context).inflate(R.layout.kaifu_new_add_item_title, null)) for (i in list.indices) { val inflate = LayoutInflater.from(view.context).inflate(R.layout.kaifu_add_item, null) val binding = KaifuAddItemBinding.bind(inflate) binding.clickListener = listener binding.entity = list[i] binding.position = i binding.isCloseBottom = list.size - 1 == i view.addView(inflate) binding.kaifuAddFirstName.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) { binding.kaifuAddFirstName.hint = "" if (binding.kaifuAddFirstName.text.isNullOrEmpty()) { showPopupOption(binding.kaifuAddFirstName) { binding.kaifuAddFirstName.setText(it) binding.kaifuAddFirstName.setSelection(it.length) } } } else { binding.kaifuAddFirstName.hint = "点击填写" } } binding.kaifuAddServerName.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) { binding.kaifuAddServerName.hint = "" } else { binding.kaifuAddServerName.hint = "点击填写" } } binding.kaifuAddFirstName.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged( s: CharSequence?, start: Int, count: Int, after: Int ) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (!s.isNullOrEmpty()) { popupWindow?.dismiss() } } override fun afterTextChanged(s: Editable?) { } }) if (i == list.size - 1) { binding.kaifuAddTime.background = R.drawable.bg_add_kaifu_bottom_left.toDrawable(view.context) binding.kaifuAddServerName.background = R.drawable.bg_add_kaifu_bottom_right.toDrawable(view.context) } } } @JvmStatic @BindingAdapter("addKaiFuTime", "addKaiFuPosition") fun addKaiFuTime(view: EditText, time: Long, position: Int) { if (time == 0L) { view.hint = "点击选择" view.setText("") } else { val pattern = "yyy-MM-dd HH:mm" val format = SimpleDateFormat(pattern, Locale.CHINA) view.setText(format.format(time * 1000)) if (position == 0) { view.append( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Html.fromHtml( String.format( "%1\$s", " +" ), Html.FROM_HTML_MODE_LEGACY ) else Html.fromHtml(String.format("%1\$s", " +")) ) } } } @JvmStatic @BindingAdapter("kaiFuTextColor", "kaiFuTextPosition") fun kaiFuTextColor(view: EditText, dataMark: Int, position: Int) { if (dataMark == 1 && view.id == R.id.kaifu_add_time || dataMark == 2 && view.id == R.id.kaifu_add_first_name || dataMark == 3 && view.id == R.id.kaifu_add_server_name || dataMark == 4) { view.setTextColor(ContextCompat.getColor(view.context, R.color.theme_red)) view.setHintTextColor(ContextCompat.getColor(view.context, R.color.theme_red)) } else if (position == 0) { view.setTextColor(ContextCompat.getColor(view.context, R.color.hint)) view.setHintTextColor(ContextCompat.getColor(view.context, R.color.hint)) } else { view.setTextColor(ContextCompat.getColor(view.context, R.color.text_title)) view.setHintTextColor(ContextCompat.getColor(view.context, R.color.hint)) } } @JvmStatic private fun showPopupOption(view: View, callback: (text: String) -> Unit) { val inflater = LayoutInflater.from(view.context) val mainBinding = LayoutPopupContainerBinding.inflate(inflater) popupWindow = BugFixedPopupWindow( mainBinding.root, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ) val windowPos = IntArray(2) val anchorLoc = IntArray(2) // 获取锚点View在屏幕上的左上角坐标位置 view.getLocationOnScreen(anchorLoc) val anchorHeight = view.height // 获取屏幕的高宽 val screenHeight = view.context.resources.displayMetrics.heightPixels popupWindow?.let { popupWindow -> // 测量contentView popupWindow.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) val windowHeight = popupWindow.contentView.measuredHeight // 判断需要向上弹出还是向下弹出显示 val isNeedShowUp = screenHeight - anchorLoc[1] - anchorHeight < windowHeight windowPos[1] = if (isNeedShowUp) { anchorLoc[1] - windowHeight } else anchorLoc[1] + anchorHeight LayoutAddKaifuPopupBinding.inflate(inflater, mainBinding.container, false).apply { root.layoutParams = root.layoutParams.apply { width = view.width + 16F.dip2px() } popupRv.adapter = AddKaiFuPopupAdapter( root.context, arrayListOf("安卓混服", "硬核专服", "官方专服", "官方渠道服", "腾讯QQ服", "腾讯微信服") ) { callback.invoke(it) popupWindow.dismiss() } popupRv.layoutManager = LinearLayoutManager(root.context) mainBinding.container.addView(root) } popupWindow.isTouchable = true popupWindow.inputMethodMode = PopupWindow.INPUT_METHOD_NEEDED popupWindow.isOutsideTouchable = true popupWindow.animationStyle = R.style.popwindow_option_anim_style // 设置偏移 windowPos[1] = windowPos[1] - 12F.dip2px() windowPos[0] = anchorLoc[0] - 11F.dip2px() popupWindow.showAtLocation(view, Gravity.TOP or Gravity.START, windowPos[0], windowPos[1]) } } }