feat(watch): 新增已登录未绑定手表的图文占位视图

- 新增 layout_no_watch 占位视图,包含图片、提示文字和"去绑定"按钮
- 新增 onBindWatchClick 回调,供外部处理绑定跳转逻辑
- 提取 showLoginEmpty() 和 showNoWatchPlaceholder() 辅助方法,统一状态管理
- 优化 setWatchInfo() 逻辑,完善已登录无手表时的视图切换
- 修复 init() 中 Tab 切换时的占位视图显示逻辑
- 改进代码格式和缩进规范
This commit is contained in:
zhanglei
2026-03-16 09:25:33 +08:00
parent c6b5966261
commit d0a92cea60
5 changed files with 283 additions and 15 deletions
@@ -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 对应)
@@ -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
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rectangle_top_round_corner20_white">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_20"
android:textColor="@color/text_black_33"
android:textSize="@dimen/txt14"
android:text="@string/dialog_appraise_title"/>
<RatingBar
android:id="@+id/rating_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
style="@style/Widget.AppCompat.RatingBar.Indicator"
android:layout_marginTop="@dimen/dp_24"
android:layout_marginHorizontal="@dimen/dp_12"
android:layout_centerHorizontal="true"
android:numStars="5"
android:stepSize="0.5"
android:rating="0"
android:isIndicator="false"
android:progressTint="@color/rating_bar_color"
android:secondaryProgressTint="@color/rating_bar_color"/>
<EditText
android:id="@+id/et_appraise"
android:longClickable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@+id/rating_bar"
android:layout_marginTop="@dimen/dp_18"
android:layout_marginHorizontal="@dimen/dp_15"
android:background="@drawable/rectangle_round_corner10_gray"
android:paddingHorizontal="@dimen/dp_12"
android:paddingVertical="@dimen/dp_9"
android:minHeight="@dimen/dp_130"
android:gravity="top"
android:textColor="@color/text_black_33"
android:textSize="@dimen/txt13"
android:hint="@string/dialog_appraise_hint"/>
<CheckBox
android:id="@+id/cb_anonymity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:layout_alignLeft="@+id/et_appraise"
android:layout_below="@+id/et_appraise"
android:button="@drawable/check_theme_style"
android:paddingLeft="@dimen/dp_8"
android:checked="false"
android:text="@string/dialog_appraise_anonymity"/>
<Button
android:id="@+id/btn_submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rectangle_round_corner20_theme"
android:text="@string/dialog_appraise_submit"
android:textColor="@color/white"
android:minHeight="@dimen/dp_0"
android:layout_below="@+id/cb_anonymity"
android:layout_marginHorizontal="@dimen/dp_48"
android:layout_marginVertical="@dimen/dp_24"
android:outlineProvider="none"
android:textSize="@dimen/txt14"
android:paddingVertical="@dimen/dp_11"/>
<ImageButton
android:id="@+id/btn_close"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:layout_alignParentRight="true"
android:background="@android:color/transparent"
android:padding="@dimen/dp_15"
android:src="@drawable/ic_close"/>
</RelativeLayout>
</layout>
@@ -6,9 +6,9 @@
<RelativeLayout
android:layout_marginHorizontal="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="12dp"
android:layout_marginTop="15dp">
<RelativeLayout
@@ -43,6 +43,7 @@
tools:text="监测工具编码:4PMBB25A28100553" />
<ImageView
android:id="@+id/img_watch_more"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_alignParentRight="true"
@@ -100,6 +101,49 @@
android:textColor="#77849E"
android:textSize="15sp" />
<!-- 已登录但未绑定手表的占位视图 -->
<LinearLayout
android:id="@+id/layout_no_watch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/watch_tab_layout"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="20dp"
android:visibility="gone"
android:paddingBottom="20dp">
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/icon_empty1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="~暂无数据~"
android:textColor="#B6B6B6"
android:textSize="11sp" />
<com.allen.library.shape.ShapeTextView
android:id="@+id/btn_bind_watch"
android:layout_width="80dp"
android:layout_height="24dp"
android:layout_marginTop="12dp"
android:gravity="center"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="去绑定"
android:textColor="@color/theme_color"
android:textSize="13sp"
app:shapeCornersRadius="16dp"
app:shapeSolidColor="@color/colorWhite"
app:shapeStrokeColor="@color/theme_color"
app:shapeStrokeWidth="1dp" />
</LinearLayout>
</com.allen.library.shape.ShapeRelativeLayout>
</RelativeLayout>