feat(home): 新增首页手表监测数据展示模块

- 新增 HomeWatchView 自定义 View,在首页展示手表监测数据概览
- 新增 WatchItemFragment 用于展示步数、心率、血氧、睡眠、压力等指标
- 新增两个 API 接口:查询用户手表绑定状态、获取当日全量手表数据
- HomeFragment 集成手表 View,登录后自动拉取手表信息及当日数据
- 新增 WatchDataChangeEvent 用于手表数据变更通知
- 新增相关布局、Tab 图标及 Drawable 资源文件
- 清理废弃颜色文件(color_child_tab_*.xml)及冗余布局

注:当前 UrlConfig 环境为 DEBUG,正式发布前请切换回 PRODUCT

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
zhanglei
2026-03-04 16:57:27 +08:00
co-authored by Claude Sonnet 4.6
parent 960791ff4d
commit 53f33b35e0
26 changed files with 720 additions and 53 deletions
@@ -0,0 +1,25 @@
package com.xjjk.healthyclients.bean.home
/**
* 首页-手表数据
*/
class HomeWatchAllDataBean {
var name: String? = null
var latest: String? = null
var max: String? = null
var min: String? = null
var avg: String? = null
var type: Int? = null
var latestTime: String? = null
}
data class WatchInfoBean(
val bindDate: String,
val hasWatch: Boolean,
val lastUploadDate: String,
val watchModel: String,
val watchNo: String
)
@@ -2,6 +2,8 @@ package com.xjjk.healthyclients.data.api
import com.xjjk.healthyclients.bean.home.HomeBannerBean
import com.xjjk.healthyclients.bean.home.HomeNoticeBean
import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean
import com.xjjk.healthyclients.bean.home.WatchInfoBean
import com.xjjk.healthyclients.bean.user.CheckInBean
import com.xjjk.healthyclients.bean.user.PointDetailBean
import com.xjjk.healthyclients.bean.user.PointRank
@@ -71,4 +73,17 @@ interface HomeApi {
@GET("/health-consultation/consultation/conSession/getPicUrl")
suspend fun getConSessionPicUrl(@QueryMap params: MutableMap<String, Any?>): ApiResponse<String>
/**
* 首页-用户手表数据
*/
@GET("/health-watch/api/watchData/userWatchDataAll")
suspend fun getHomeWatchData(@QueryMap params: MutableMap<String, Any?>): ApiResponse<MutableList<HomeWatchAllDataBean>>
/**
* 首页-用户是否有手表
*/
@GET("/health-watch/api/watchData/findWatchInfo")
suspend fun getHomeWatchInfo(@QueryMap params: MutableMap<String, Any?>): ApiResponse<WatchInfoBean>
}
@@ -3,6 +3,8 @@ package com.xjjk.healthyclients.data.repository
import com.xjjk.healthyclients.base.repository.BaseRepository
import com.xjjk.healthyclients.bean.home.HomeBannerBean
import com.xjjk.healthyclients.bean.home.HomeNoticeBean
import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean
import com.xjjk.healthyclients.bean.home.WatchInfoBean
import com.xjjk.healthyclients.bean.user.CheckInBean
import com.xjjk.healthyclients.bean.user.PointDetailBean
import com.xjjk.healthyclients.bean.user.PointRank
@@ -80,4 +82,22 @@ object HomeRepository : BaseRepository() {
val map = mutableMapOf<String, Any?>()
return apiCall { service.getConSessionPicUrl(map) }
}
/**
* 首页-用户手表数据
*/
suspend fun getHomeWatchData(date:String): ApiResponse<MutableList<HomeWatchAllDataBean>> {
return apiCall {
val map = mutableMapOf<String, Any?>()
map["date"] = date
service.getHomeWatchData(map)
}
}
suspend fun getHomeWatchInfo(userId: String?): ApiResponse<WatchInfoBean> {
return apiCall {
val map = mutableMapOf<String, Any?>()
map["userId"] = userId
service.getHomeWatchInfo(map)
}
}
}
@@ -0,0 +1,12 @@
package com.xjjk.healthyclients.event
import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean
/**
* 手表数据变更事件
* 用于 HomeWatchView → WatchItemFragment 的数据通知
* @param dataList 接口返回的手表各项健康数据列表(按索引对应各 Tab)
*/
class WatchDataChangeEvent {
var dataList: MutableList<HomeWatchAllDataBean>? = null
}
@@ -9,6 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.sw.healthyclients.data.local.DataStoreManager
import com.sw.healthyclients.utils.DateUtil
import com.tencent.qcloud.tuikit.tuichat.bean.WorkBean
import com.xjjk.healthyclients.R
import com.xjjk.healthyclients.adapter.common.MultiItemTypeAdapter
@@ -23,6 +24,7 @@ import com.xjjk.healthyclients.superfuntion.startGroupChat
import com.xjjk.healthyclients.superfuntion.startLoginActivity
import com.xjjk.healthyclients.superfuntion.startMyGuidanceActivity
import com.xjjk.healthyclients.ui.activity.EmptyActivity
import com.xjjk.healthyclients.ui.activity.LoginActivity
import com.xjjk.healthyclients.ui.activity.guidance.adapter.GuidanceFragmentDoctorAdapter
import com.xjjk.healthyclients.ui.activity.home.HomeBannerDetailActivity
import com.xjjk.healthyclients.ui.activity.home.HomeNoticeListActivity
@@ -111,7 +113,7 @@ class HomeFragment :
})
mBinding.layoutItem3.fragmentGuidanceRvDoctor.adapter = mGuidanceFragmentDoctorAdapter
mBinding.watchView.init(this@HomeFragment)
}
override fun bindEvent() {
@@ -128,6 +130,13 @@ class HomeFragment :
layoutItem1.homeHeadTab4, layoutItem3.tvDoctorMore
)
}
mBinding.watchView.mBinding.layoutWatchMore.setOnClickListener{
if (DataStoreManager.isLogin()) {
EventBus.getDefault().post(HomeTabChangeEvent().apply { index = 3 })
} else {
toActivity(LoginActivity::class.java)
}
}
}
override fun onClick(v: View?) {
@@ -297,23 +306,41 @@ class HomeFragment :
}
}
}
lifecycleScope.launch{
repeatOnLifecycle(Lifecycle.State.CREATED){
mViewModel.watchInfo.collectLatest { bean ->
mBinding.watchView.setWatchInfo(bean)
if (bean?.hasWatch==true) {//有手表的情况下去获取手表数据
mViewModel.getHomeWatchData(DateUtil.nowStringDateShort)
}
}
}
}
lifecycleScope.launch{
repeatOnLifecycle(Lifecycle.State.CREATED){
mViewModel.watchAllData.collectLatest { bean ->
mBinding.watchView.setWatchAllData(bean)
}
}
}
}
override fun initData() {
mViewModel.getHomeBannerList()
if (ConstantUtils.mCheckToken) {
mViewModel.selectDoctorRecommendHome()
}
mViewModel.selectDoctorRecommendHome()
if (DataStoreManager.isLogin()) {
homeNoticeStartRepeat()
mViewModel.getHomeWatchInfo(DataStoreManager.getUserId())
}
}
private fun homeNoticeStartRepeat() {
lifecycleScope.launch {
repeat(100) {
repeat(500) {
mViewModel.getHomeNoticeListRepeat()
delay(noticeTime)
}
@@ -329,6 +356,7 @@ class HomeFragment :
}
if (DataStoreManager.isLogin()) {
mViewModel.getHomeNoticeListRepeat()
mViewModel.getHomeWatchInfo(DataStoreManager.getUserId())
}
}
@@ -0,0 +1,144 @@
package com.xjjk.healthyclients.fragment
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import androidx.fragment.app.Fragment
import com.sw.healthyclients.utils.DateUtil
import com.xjjk.healthyclients.R
import com.xjjk.healthyclients.base.BaseVMBFragment
import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean
import com.xjjk.healthyclients.databinding.FragmentItemWatchBinding
import com.xjjk.healthyclients.event.WatchDataChangeEvent
import com.xjjk.healthyclients.superfuntion.orEmptyDefault
import com.xjjk.healthyclients.ui.viewmodel.HomeViewModel
/**
* 手表item
* 数据类型:0=心率 1=血氧 2=压力 3=体温 4=睡眠
*/
class WatchItemFragment :
BaseVMBFragment<HomeViewModel, FragmentItemWatchBinding>(R.layout.fragment_item_watch) {
var position: Int? = -1
fun newInstance(position: Int): Fragment {
val args = Bundle()
args.putInt("position", position)
val fragment = WatchItemFragment()
fragment.arguments = args
return fragment
}
override fun initView(root: View?, savedInstanceState: Bundle?) {
position = arguments?.getInt("position")
mBinding.watchTypeImg.setImageResource(getWatchTypeImg(position))
if (position != 4) {
mBinding.watchType.text = "" + mBinding.watchType.getText() + getWatchTypeText(position)
mBinding.watchLeftText.text = getWatchTypeText(position) +"范围"
mBinding.watchRightText.text = "平均"+getWatchTypeText(position)
} else {
mBinding.watchType.text = "睡眠总时长"
mBinding.watchLeftText.text = "深睡时长"
mBinding.watchRightText.text = "浅睡时长"
}
mBinding.watchValueUnit.text = getWatchUnitText(position)
mBinding.watchLeftUnit.text = getWatchUnitText(position)
mBinding.watchRightUnit.text = getWatchUnitText(position)
refreshWatchData(null)
}
override fun bindEvent() {
}
override fun onClick(v: View?) {
}
/**
* 接收手表数据变更事件,按当前 Tab position 取出对应数据并刷新界面
*/
override fun onMessageEvent(event: Any?) {
super.onMessageEvent(event)
if (event is WatchDataChangeEvent) {
event.dataList?.sortBy { it.type }
val bean = event.dataList?.getOrNull(position ?: -1)
refreshWatchData(bean)
}
}
/**
* 将接口数据填充到各 UI 控件
* @param bean 当前 Tab 对应的一条手表健康数据
*/
private fun refreshWatchData(bean: HomeWatchAllDataBean?) {
// 采集时间
mBinding.watchTime.text = bean?.latestTime.orEmptyDefault()
if (position != 4) {
// 最新值 + 单位
mBinding.watchValue.text = bean?.latest.orEmptyDefault()
// 范围:min ~ max
if (TextUtils.isEmpty(bean?.min)) {
mBinding.watchLeftValue.text = "--"
} else {
mBinding.watchLeftValue.text = "${bean?.min.orEmptyDefault()}-${bean?.max.orEmptyDefault()}"
}
// 平均值
mBinding.watchRightValue.text = bean?.avg.orEmptyDefault()
} else {
//睡眠数据单独处理
if (bean == null) {
mBinding.watchValue.text = "--"
mBinding.watchLeftValue.text = "--"
mBinding.watchRightValue.text = "--"
} else {
mBinding.watchValue.text =
DateUtil.timeDiff(bean.latest!!.toLong() * 1000 * 60).orEmptyDefault()
mBinding.watchLeftValue.text =
DateUtil.timeDiff(bean.max!!.toLong() * 1000 * 60).orEmptyDefault()
mBinding.watchRightValue.text =
DateUtil.timeDiff(bean.min!!.toLong() * 1000 * 60).orEmptyDefault()
}
}
}
private fun getWatchTypeImg(type: Int?): Int {
return when (type) {
0 -> R.mipmap.ic_home_watch_tab1
1 -> R.mipmap.ic_home_watch_tab2
2 -> R.mipmap.ic_home_watch_tab3
3 -> R.mipmap.ic_home_watch_tab4
4 -> R.mipmap.ic_home_watch_tab5
else -> R.mipmap.ic_home_watch_tab1
}
}
private fun getWatchTypeText(type: Int?): String {
return when (type) {
0 -> "心率"
1 -> "血氧"
2 -> "压力"
3 -> "体温"
else -> ""
}
}
private fun getWatchUnitText(type: Int?): String {
return when (type) {
0 -> "次/分钟"
1 -> "%"
2 -> ""
3 -> ""
else -> ""
}
}
}
@@ -11,6 +11,7 @@ import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatActivity
@@ -523,7 +524,7 @@ fun ViewPager2.init(
*/
fun TabLayout.onCreateTab(
tabList: Array<String>,
tabStyle: Int = 2,
tabStyle: Int = 1,
listener: (TabLayout.Tab?) -> Unit
) {
for (tabTitle in tabList) {
@@ -547,11 +548,12 @@ fun TabLayout.onCreateTab(
}
private fun onConfigureTab(context: Context, tab: TabLayout.Tab, tabTitle: String, tabStyle: Int) {
val textView = LayoutInflater.from(context)
.inflate(getTabStyle(tabStyle), null) as TextView
textView.text = tabTitle
tab.customView = textView
private fun onConfigureTab(context: Context,tab: TabLayout.Tab, tabTitle: String,tabStyle: Int) {
val tabView = LayoutInflater.from(context)
.inflate(getTabStyle(tabStyle), null) as RelativeLayout
val tabText = tabView.findViewById<TextView>(R.id.tv_text)
tabText.text = tabTitle
tab.customView = tabView
}
@@ -583,13 +585,11 @@ fun TabLayout.attachViewPager(
/**
* tab 样式
* 1:通用样式 2:癌症结论tab样式
* 1:通用样式 绿色/灰色
*/
fun getTabStyle(i: Int): Int {
return when (i) {
1 -> R.layout.item_tablayout_group_title
2 -> R.layout.item_tablayout_group_title2
102 -> R.layout.item_home_tab_group//首页
else -> R.layout.item_tablayout_group_title
}
}
@@ -3,6 +3,7 @@ package com.xjjk.healthyclients.ui.activity
import android.graphics.Bitmap
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebView
@@ -109,6 +110,7 @@ class InterventionWebActivity() :
// Log.e("mzf","file:///android_asset/dist/index.html?p=$path&r=${url}&t=${mToken}&id=${mUserId}&d=${date}")
// Log.e("mzf", "$localAdress&d=${date}")
mBinding.webView.loadUrl("$localAdress&d=${date}&h=${urlType}")
Log.i("InterventionWebActivity", "url: "+mBinding.webView.url)
}
private fun getTitleText(path: String?): String {
@@ -4,6 +4,8 @@ import com.xjjk.healthyclients.base.viewmodel.BaseViewModel
import com.xjjk.healthyclients.bean.guidance.GuidanceListBean
import com.xjjk.healthyclients.bean.home.HomeBannerBean
import com.xjjk.healthyclients.bean.home.HomeNoticeBean
import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean
import com.xjjk.healthyclients.bean.home.WatchInfoBean
import com.xjjk.healthyclients.data.repository.GuidanceRepository
import com.xjjk.healthyclients.data.repository.HomeRepository
import com.xjjk.healthyclients.superfuntion.handleRequest
@@ -21,6 +23,10 @@ class HomeViewModel : BaseViewModel() {
var homeBannerList = MutableSharedFlow<MutableList<HomeBannerBean>?>()
var sessionPicUrl = MutableSharedFlow<String?>()
//手表
var watchInfo = MutableSharedFlow<WatchInfoBean?>()
var watchAllData = MutableSharedFlow<MutableList<HomeWatchAllDataBean>?>()
var isRefreshing = MutableStateFlow(false)
var isLoadMoreEnd = MutableSharedFlow<Boolean>()
@@ -34,7 +40,6 @@ class HomeViewModel : BaseViewModel() {
fun selectDoctorRecommendHome() {
launch(
{
handleRequest(
GuidanceRepository.selectDoctorRecommend(1,3),
successBlock = {
@@ -135,5 +140,29 @@ class HomeViewModel : BaseViewModel() {
)
}
fun getHomeWatchData(date:String) {
launch(
{
handleRequest(
HomeRepository.getHomeWatchData(date),
successBlock = {
watchAllData.emit(it.result)
})
}
)
}
fun getHomeWatchInfo(userId: String?) {
launch(
{
handleRequest(
HomeRepository.getHomeWatchInfo(userId),
successBlock = {
watchInfo.emit(it.result)
})
}
)
}
}
@@ -0,0 +1,81 @@
package com.xjjk.healthyclients.view
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.RelativeLayout
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import com.sw.healthyclients.adapter.common.ViewPagerAdapter
import com.sw.healthyclients.bean.common.TabItemBean
import com.xjjk.healthyclients.R
import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean
import com.xjjk.healthyclients.bean.home.WatchInfoBean
import com.xjjk.healthyclients.databinding.LayoutHomeItemWatchBinding
import com.xjjk.healthyclients.event.WatchDataChangeEvent
import com.xjjk.healthyclients.fragment.WatchItemFragment
import com.xjjk.healthyclients.superfuntion.init
import com.xjjk.healthyclients.superfuntion.onCreateTab
import org.greenrobot.eventbus.EventBus
class HomeWatchView(context: Context?, attrs: AttributeSet?) :
RelativeLayout(context, attrs, 0), ViewPagerAdapter.OnCreateFragmentListener {
var mContext: Context? = context
var mBinding: LayoutHomeItemWatchBinding = DataBindingUtil.inflate(
LayoutInflater.from(context),
R.layout.layout_home_item_watch, this, true
)
fun init(fragment: Fragment) {
val arrayOf = arrayOf("心脑血管", "癌症", "慢呼", "糖尿病", "亚健康")
mBinding.watchTabLayout.onCreateTab(arrayOf, 1) {tab->
if (tab?.position != 0) {
mBinding.emptyText.visibility = View.VISIBLE
mBinding.emptyText.text = "开发中"
mBinding.viewPager.visibility = View.GONE
} else {
mBinding.viewPager.visibility = View.VISIBLE
mBinding.emptyText.visibility = View.GONE
}
}
val tabList: MutableList<TabItemBean> = mutableListOf()
(0..4).forEach { _ ->
tabList.add(TabItemBean())
}
mBinding.viewPager.init(fragment, tabList.toTypedArray(), this, 5)
}
fun setWatchInfo(watchInfo: WatchInfoBean?) {
if (watchInfo?.hasWatch == true) {
mBinding.viewPager.visibility = View.VISIBLE
mBinding.watchName.visibility = View.VISIBLE
mBinding.emptyText.visibility = View.GONE
mBinding.watchName.text = "监测工具编码:${watchInfo.watchNo}"
} else {
mBinding.viewPager.visibility = View.GONE
mBinding.watchName.visibility = View.GONE
mBinding.emptyText.visibility = View.VISIBLE
mBinding.emptyText.text = "您目前未配备智能穿戴设备"
}
}
/**
* 接收手表详细数据并通过 EventBus 通知各 WatchItemFragment 刷新
* @param dataList 接口返回的手表各项健康数据列表(索引与 Tab position 对应)
*/
fun setWatchAllData(dataList: MutableList<HomeWatchAllDataBean>?) {
EventBus.getDefault().post(WatchDataChangeEvent().apply {
this.dataList = dataList
})
}
override fun createFragment(position: Int): Fragment {
return WatchItemFragment().newInstance(position)
}
}
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/text_black_33" android:state_selected="true" />
<item android:color="#77849E" android:state_selected="false"/>
<item android:color="#77849E"/>
</selector>
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#117474" android:state_selected="true" />
<item android:color="#83CDCD" android:state_selected="false"/>
<item android:color="#83CDCD"/>
</selector>
@@ -4,5 +4,5 @@
<item android:drawable="@drawable/rectangle_round_corner20_theme" android:state_checked="true"/>
<item android:drawable="@drawable/rectangle_round_corner20_theme" android:state_selected="true"/>
<!-- 默认状态-->
<item android:drawable="@drawable/rectangle_round_corner20_white"/>
<item android:drawable="@drawable/rectangle_round_corner20_white_home"/>
</selector>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
android:useLevel="false">
<solid android:color="#30A9FF" />
<size
android:width="4dp"
android:height="11dp" />
<corners android:radius="@dimen/dp_2" />
</shape>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
android:useLevel="false">
<solid android:color="#43D0B0" />
<size
android:width="4dp"
android:height="11dp" />
<corners android:radius="@dimen/dp_2" />
</shape>
@@ -88,6 +88,7 @@
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@drawable/imaginary_line"/>
<include layout="@layout/item_bank_points"/>
</LinearLayout>
@@ -111,6 +111,10 @@
android:layout_height="60dp"
android:layout_marginHorizontal="12dp"
android:layout_marginTop="10dp" />
<com.xjjk.healthyclients.view.HomeWatchView
android:id="@+id/watch_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<com.youth.banner.Banner
android:id="@+id/banner3"
@@ -0,0 +1,196 @@
<?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:layout_marginTop="15dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/watch_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
<ImageView
android:id="@+id/watch_type_img"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="12dp"
android:src="@mipmap/ic_home_watch_tab1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/watch_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginTop="8dp"
android:layout_marginRight="15dp"
android:text="最新"
android:textColor="@color/text_black_33"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/watch_type_img"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/watch_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginTop="3dp"
android:textColor="#77849E"
android:textSize="12sp"
app:layout_constraintStart_toEndOf="@+id/watch_type_img"
app:layout_constraintTop_toBottomOf="@+id/watch_type" />
<TextView
android:id="@+id/watch_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:paddingRight="2dp"
android:textColor="@color/text_black_33"
android:textSize="25sp"
android:textStyle="bold"
app:layout_constraintRight_toLeftOf="@+id/watch_value_unit"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/watch_value_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
android:textColor="#77849E"
android:textSize="11sp"
app:layout_constraintBaseline_toBaselineOf="@+id/watch_value"
app:layout_constraintRight_toRightOf="parent" />
<com.allen.library.shape.ShapeRelativeLayout
android:id="@+id/watch_layout_left"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="21dp"
android:layout_marginRight="7dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/watch_layout_right"
app:layout_constraintTop_toBottomOf="@+id/watch_type_img"
app:shapeCornersRadius="8dp"
app:shapeSolidColor="#F6F6F6">
<TextView
android:id="@+id/watch_left_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="7dp"
android:drawableLeft="@drawable/rect_line_green"
android:drawablePadding="6dp"
android:text="范围"
android:textColor="@color/text_black_33"
android:textSize="14sp" />
<TextView
android:id="@+id/watch_left_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/watch_left_text"
android:layout_marginLeft="15dp"
android:layout_marginTop="12dp"
android:layout_marginBottom="15dp"
android:drawablePadding="6dp"
android:textColor="@color/text_black_33"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/watch_left_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/watch_left_value"
android:layout_marginLeft="5dp"
android:layout_marginTop="12dp"
android:layout_marginRight="7dp"
android:layout_toRightOf="@+id/watch_left_value"
android:drawablePadding="6dp"
android:textColor="@color/text_black_33"
android:textSize="12sp" />
</com.allen.library.shape.ShapeRelativeLayout>
<com.allen.library.shape.ShapeRelativeLayout
android:id="@+id/watch_layout_right"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="7dp"
android:layout_marginTop="21dp"
android:layout_marginRight="15dp"
app:layout_constraintLeft_toRightOf="@+id/watch_layout_left"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/watch_type_img"
app:shapeCornersRadius="8dp"
app:shapeSolidColor="#F6F6F6">
<TextView
android:id="@+id/watch_right_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="7dp"
android:drawableLeft="@drawable/rect_line_blue"
android:drawablePadding="6dp"
android:text="平均"
android:textColor="@color/text_black_33"
android:textSize="14sp" />
<TextView
android:id="@+id/watch_right_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/watch_right_text"
android:layout_marginLeft="15dp"
android:layout_marginTop="12dp"
android:layout_marginBottom="15dp"
android:drawablePadding="6dp"
android:textColor="@color/text_black_33"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/watch_right_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/watch_right_value"
android:layout_marginLeft="5dp"
android:layout_marginTop="12dp"
android:layout_marginRight="7dp"
android:layout_toRightOf="@+id/watch_right_value"
android:drawablePadding="6dp"
android:textColor="@color/text_black_33"
android:textSize="12sp" />
</com.allen.library.shape.ShapeRelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>
</layout>
@@ -1,13 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_tab_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_child_tab_layout_item"
android:paddingVertical="@dimen/dp_7"
android:paddingHorizontal="@dimen/dp_15"
android:includeFontPadding="false"
android:gravity="center"
android:textColor="@color/color_child_tab_layout_text"
android:textSize="@dimen/txt13"
android:id="@+id/tv_tab_layout">
</TextView>
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="5dp"
android:background="@drawable/bg_child_tab_layout_item"
android:gravity="center"
android:includeFontPadding="false"
android:paddingHorizontal="@dimen/dp_10"
android:paddingVertical="@dimen/dp_7"
android:textColor="@color/color_child_tab_layout_text_home"
android:textSize="@dimen/txt13" />
</RelativeLayout>
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_tab_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_child_tab_layout_item2"
android:gravity="center"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingVertical="8dp"
android:textColor="@color/color_child_tab_etiological_result"
android:textSize="@dimen/txt13">
</TextView>
@@ -0,0 +1,108 @@
<?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">
<RelativeLayout
android:layout_marginHorizontal="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<RelativeLayout
android:id="@+id/layout_watch_more"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="@mipmap/ic_home_item_head_bg"
android:scaleType="fitXY">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="8dp"
android:ellipsize="end"
android:text="健康监测"
android:textColor="@color/text_black_33"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/watch_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:layout_marginRight="36dp"
android:ellipsize="end"
android:textColor="#14BEBE"
android:textSize="13sp"
tools:text="监测工具编码:4PMBB25A28100553" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_alignParentRight="true"
android:layout_marginTop="12dp"
android:layout_marginRight="15dp"
android:background="@drawable/arrow_right"
android:padding="10dp" />
</RelativeLayout>
<com.allen.library.shape.ShapeRelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:orientation="vertical"
app:shadowCornersBottomRightRadius="12dp"
app:shapeCornersBottomLeftRadius="12dp"
app:shapeSolidColor="@color/white">
<com.google.android.material.tabs.TabLayout
android:id="@+id/watch_tab_layout"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@+id/toolbar_lay"
android:layout_marginTop="5dp"
android:background="@color/white"
app:tabIndicatorFullWidth="false"
app:tabIndicatorHeight="@dimen/dp_0"
app:tabMinWidth="@dimen/dp_0"
app:tabMode="auto"
app:tabPaddingEnd="@dimen/dp_0"
app:tabPaddingStart="@dimen/dp_0"
app:tabRippleColor="@null" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/watch_tab_layout"
android:layout_marginBottom="10dp"
android:visibility="gone">
</androidx.viewpager2.widget.ViewPager2>
<TextView
android:id="@+id/empty_text"
android:layout_width="wrap_content"
android:layout_height="45dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="55dp"
android:background="@color/white"
android:gravity="center"
android:text="暂未登录"
android:textColor="#77849E"
android:textSize="12sp" />
</com.allen.library.shape.ShapeRelativeLayout>
</RelativeLayout>
</layout>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB