From d0a92cea607e4fd826a29f3c50edc35d0043407f Mon Sep 17 00:00:00 2001 From: zhanglei <350328959@qq.com> Date: Mon, 16 Mar 2026 09:25:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(watch):=20=E6=96=B0=E5=A2=9E=E5=B7=B2?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=9C=AA=E7=BB=91=E5=AE=9A=E6=89=8B=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E5=9B=BE=E6=96=87=E5=8D=A0=E4=BD=8D=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 layout_no_watch 占位视图,包含图片、提示文字和"去绑定"按钮 - 新增 onBindWatchClick 回调,供外部处理绑定跳转逻辑 - 提取 showLoginEmpty() 和 showNoWatchPlaceholder() 辅助方法,统一状态管理 - 优化 setWatchInfo() 逻辑,完善已登录无手表时的视图切换 - 修复 init() 中 Tab 切换时的占位视图显示逻辑 - 改进代码格式和缩进规范 --- .../xjjk/healthyclients/view/HomeWatchView.kt | 45 ++++--- .../healthyclients/view/WatchBindDialog.kt | 118 ++++++++++++++++++ .../main/res/drawable-xxhdpi/icon_empty1.png | Bin 0 -> 9998 bytes app/src/main/res/layout/dialog_bind_watch.xml | 89 +++++++++++++ .../res/layout/layout_home_item_watch.xml | 46 ++++++- 5 files changed, 283 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/xjjk/healthyclients/view/WatchBindDialog.kt create mode 100644 app/src/main/res/drawable-xxhdpi/icon_empty1.png create mode 100644 app/src/main/res/layout/dialog_bind_watch.xml diff --git a/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt b/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt index f5b4e2d..e095135 100644 --- a/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt +++ b/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt @@ -1,6 +1,7 @@ package com.xjjk.healthyclients.view import android.content.Context +import android.graphics.Color import android.os.Handler import android.os.Looper import android.util.AttributeSet @@ -26,11 +27,11 @@ class HomeWatchView(context: Context?, attrs: AttributeSet?) : RelativeLayout(context, attrs, 0), ViewPagerAdapter.OnCreateFragmentListener { - companion object { + companion object { /** 自动轮播间隔时间(毫秒) */ private const val AUTO_PLAY_INTERVAL = 5000L } - private var hasWatch :Boolean=false + private var hasWatch: Boolean = false var mContext: Context? = context var mBinding: LayoutHomeItemWatchBinding = DataBindingUtil.inflate( @@ -60,25 +61,23 @@ class HomeWatchView(context: Context?, attrs: AttributeSet?) : fun init(fragment: Fragment) { val arrayOf = arrayOf("心脑血管", "癌症", "慢呼", "糖尿病", "亚健康") - mBinding.watchTabLayout.onCreateTab(arrayOf, 1) {tab-> + mBinding.watchTabLayout.onCreateTab(arrayOf, 1) { tab -> if (tab?.position != 0) { mBinding.emptyText.visibility = View.VISIBLE mBinding.emptyText.text = "紧急开发中" mBinding.viewPager.visibility = View.GONE + mBinding.layoutNoWatch.visibility = View.GONE stopAutoPlay() } else { if (!DataStoreManager.isLogin()) { - mBinding.viewPager.visibility = View.GONE - mBinding.emptyText.visibility = View.VISIBLE - mBinding.emptyText.text = "暂未登录" - }else if (hasWatch) { + showLoginEmpty() + } else if (hasWatch) { mBinding.viewPager.visibility = View.VISIBLE mBinding.emptyText.visibility = View.GONE + mBinding.layoutNoWatch.visibility = View.GONE startAutoPlay() } else { - mBinding.viewPager.visibility = View.GONE - mBinding.emptyText.visibility = View.VISIBLE - mBinding.emptyText.text = "您目前未配备智能穿戴设备" + showNoWatchPlaceholder() } } @@ -111,18 +110,36 @@ class HomeWatchView(context: Context?, attrs: AttributeSet?) : fun setWatchInfo(watchInfo: WatchInfoBean?) { if (watchInfo?.hasWatch == true) { + hasWatch = true mBinding.viewPager.visibility = View.VISIBLE - mBinding.watchName.visibility = View.VISIBLE mBinding.emptyText.visibility = View.GONE + mBinding.layoutNoWatch.visibility = View.GONE + mBinding.watchName.setTextColor(Color.parseColor("#14BEBE")) mBinding.watchName.text = "监测工具编码:${watchInfo.watchNo}" } else { + hasWatch = false + mBinding.watchName.setTextColor(Color.parseColor("#808080")) + mBinding.watchName.text = "监测工具编码:暂无信息" mBinding.viewPager.visibility = View.GONE - mBinding.watchName.visibility = View.GONE - mBinding.emptyText.visibility = View.VISIBLE - mBinding.emptyText.text = "您目前未配备智能穿戴设备" + showNoWatchPlaceholder() } } + /** 展示未登录占位文字 */ + private fun showLoginEmpty() { + mBinding.viewPager.visibility = View.GONE + mBinding.emptyText.visibility = View.VISIBLE + mBinding.emptyText.text = "暂未登录" + mBinding.layoutNoWatch.visibility = View.GONE + } + + /** 展示已登录但未绑定手表的图文占位视图 */ + private fun showNoWatchPlaceholder() { + mBinding.viewPager.visibility = View.GONE + mBinding.emptyText.visibility = View.GONE + mBinding.layoutNoWatch.visibility = View.VISIBLE + } + /** * 接收手表详细数据并通过 EventBus 通知各 WatchItemFragment 刷新 * @param dataList 接口返回的手表各项健康数据列表(索引与 Tab position 对应) diff --git a/app/src/main/java/com/xjjk/healthyclients/view/WatchBindDialog.kt b/app/src/main/java/com/xjjk/healthyclients/view/WatchBindDialog.kt new file mode 100644 index 0000000..dca5279 --- /dev/null +++ b/app/src/main/java/com/xjjk/healthyclients/view/WatchBindDialog.kt @@ -0,0 +1,118 @@ +package com.xjjk.healthyclients.view + +import android.app.AlertDialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Build +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import android.widget.LinearLayout +import android.widget.RatingBar +import android.widget.Toast +import androidx.databinding.DataBindingUtil +import com.sw.healthyclients.view.CustomToast +import com.xjjk.healthyclients.R +import com.xjjk.healthyclients.databinding.DialogAppraiseBinding + +class AppraiseDialog constructor( + context: Context +) : AlertDialog(context) { + lateinit var mOnSubmitClickListener: OnSubmitClickListener + lateinit var binding: DialogAppraiseBinding + + init { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + create() + } else { + onCreate(null) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.dialog_appraise, null, false + ) + setContentView(binding.root) + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))//设置dialog背景透明 + window?.setGravity(Gravity.BOTTOM) + window?.setLayout( + context.resources.displayMetrics.widthPixels, + LinearLayout.LayoutParams.WRAP_CONTENT + );//设置对话框大小 + window?.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) + binding.btnSubmit.setOnClickListener { + if (getRating()==0F) { + CustomToast.makeText(context, "您还没有选择星级评分", Toast.LENGTH_SHORT).show() + return@setOnClickListener + } + if (this::mOnSubmitClickListener.isInitialized) { + mOnSubmitClickListener?.onSubmitClick(this@AppraiseDialog) + } + this.cancel() + } + binding.btnClose.setOnClickListener { + if (this::mOnSubmitClickListener.isInitialized) { + mOnSubmitClickListener?.onCancelClick(this@AppraiseDialog) + } + this.cancel() + } + + } + + fun setOnSubmitClickListener(onSubmitClickListener: OnSubmitClickListener): AppraiseDialog { + this.mOnSubmitClickListener = onSubmitClickListener + return this + } + + interface OnSubmitClickListener { + fun onSubmitClick(viewDialog: AppraiseDialog) + fun onCancelClick(viewDialog: AppraiseDialog){} + } + + fun setDialogTitle(title: String, titleSize: Float = 18f): AppraiseDialog { + binding.tvTitle.visibility = View.VISIBLE + binding.tvTitle.text = title + binding.tvTitle.textSize = titleSize + return this + } + + fun setContentHint(text: String, textSize: Float = 13f): AppraiseDialog { + binding.etAppraise.hint = text + binding.etAppraise.textSize = textSize + return this + } + + fun setBtnText(text: String, btnTextSize: Float = 18f): AppraiseDialog { + binding.btnSubmit.text = text + binding.btnSubmit.textSize = btnTextSize + return this + } + + fun setDialogCancelable(flag: Boolean): AppraiseDialog { + setCancelable(flag) + return this + } + + fun getAppraiseContext(): String { + return binding.etAppraise.text.trim().toString() + } + + fun getRatingBar(): RatingBar { + return binding.ratingBar + } + fun getRating(): Float { + return getRatingBar().rating + } + /** + * 获取匿名状态 + */ + fun getAnonymityStatus(): Boolean { + return binding.cbAnonymity.isChecked + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/icon_empty1.png b/app/src/main/res/drawable-xxhdpi/icon_empty1.png new file mode 100644 index 0000000000000000000000000000000000000000..888ec9513320df403d19069e08c67ed27639d603 GIT binary patch literal 9998 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 YKlp2C=I|~HzyJUM07*qoM6N<$g3xuL!T + + + + + + + + + + + +