refactor(ui): 将设置页面由多个 LinearLayout 重构为 RecyclerView 实现

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-15 15:18:26 +08:00
co-authored by Claude Sonnet 4.6
parent 8b19da2710
commit 1024d82958
5 changed files with 213 additions and 568 deletions
@@ -0,0 +1,42 @@
package com.shuwei.dish.match.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.shuwei.dish.match.databinding.ListItemSettingBinding
import com.shuwei.dish.match.model.SettingItem
import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.visible
/**
* 设置页面列表适配器
* 点击事件直接调用 item.onClick(),无需在 Adapter 中分发业务逻辑
*/
class SettingAdapter : BaseQuickAdapter<SettingItem, SettingAdapter.VH>() {
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH {
val binding = ListItemSettingBinding.inflate(LayoutInflater.from(context), parent, false)
return VH(binding)
}
override fun onBindViewHolder(holder: VH, position: Int, item: SettingItem?) {
item ?: return
holder.binding.tvTitle.text = item.title
// 有副标题则显示,否则隐藏
val subtitle = item.subtitle
if (subtitle != null) {
holder.binding.tvSubtitle.visible()
holder.binding.tvSubtitle.text = subtitle
} else {
holder.binding.tvSubtitle.gone()
}
// 点击事件直接委托给实体类中注入的 lambda
holder.binding.root.setOnClickListener { item.onClick() }
}
inner class VH(val binding: ListItemSettingBinding) : QuickViewHolder(binding.root)
}
@@ -0,0 +1,38 @@
package com.shuwei.dish.match.model
/**
* 设置页面的列表项实体类
*
* @param type 菜单项类型,用于唯一标识每一项
* @param title 主标题文字
* @param subtitle 副标题文字,仅部分项目(如菜品模式)有值
* @param isHidden 是否为隐藏项,隐藏项需触发开发者模式后才显示
* @param onClick 点击回调,初始化时直接注入对应的业务逻辑
*/
data class SettingItem(
val type: Type,
val title: String,
val subtitle: String? = null,
val isHidden: Boolean = false,
val onClick: () -> Unit
) {
/** 设置菜单项类型枚举 */
enum class Type {
/** 菜品模式切换 */
COOK_MODE,
/** 调料区设置 */
SEASONING_CONFIG,
/** 食材采集 */
FOOD_COLLECT,
/** 数据库查看(隐藏项) */
DB_INSPECT,
/** 秤数据监控(隐藏项) */
SCALE_OBSERVE,
/** 切换环境(隐藏项) */
ENV_SWITCH,
/** 数据清除(隐藏项) */
CLEAR_DATA,
/** 测试调料拿取(隐藏项) */
TEST_SEASONING,
}
}
@@ -9,10 +9,13 @@ import android.os.Build
import android.os.Bundle
import android.provider.Settings
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.shuwei.dish.match.adapter.SettingAdapter
import com.shuwei.dish.match.base.BaseActivity
import com.shuwei.dish.match.databinding.ActivitySettingBinding
import com.shuwei.dish.match.dialog.CommonDialog
import com.shuwei.dish.match.dialog.EnvSwitchDialog
import com.shuwei.dish.match.model.SettingItem
import com.shuwei.dish.match.scale.ScaleServiceManager
import com.shuwei.dish.match.utils.SpTool
import com.shuwei.dish.match.utils.ext.clickWithDebounce
@@ -20,8 +23,8 @@ import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.visible
/**
* 设置Activity
* 功能:管理多个设置相关的Fragment,支持Fragment切换
* 设置页面
* 使用 RecyclerView 展示设置菜单项,点击逻辑内聚在各 SettingItem 的 onClick 中
*/
class SettingActivity : BaseActivity() {
@@ -30,10 +33,11 @@ class SettingActivity : BaseActivity() {
}
private lateinit var binding: ActivitySettingBinding
// private val cameraUtils: CameraUtils by lazy {
// CameraUtils(this)
// }
// private lateinit var previewView: PreviewView
/** 包含全部菜单项的完整列表(含隐藏项) */
private val allItems: List<SettingItem> by lazy { buildAllItems() }
private val adapter = SettingAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -46,58 +50,84 @@ class SettingActivity : BaseActivity() {
it.text = "设备设置"
}, rightIconAction = {
it.visible()
// 点击右上角图标,展示全部隐藏的开发者选项
it.clickWithDebounce {
binding.llDbInspect.visible()
binding.llScaleObserve.visible()
binding.llClearData.visible()
binding.llEnvSwitch.visible()
binding.llTestSeasoning.visible()
adapter.submitList(allItems.toList())
}
})
initView()
// // 默认显示设备配置Fragment
// if (savedInstanceState == null) {
// showDeviceConfigFragment()
// }
//
// initUI()
}
private fun initView() {
binding.tvCurrentMode.text = when (SpTool.cookMode) {
0 -> "当前:制作模式"
1 -> "当前:采样模式"
else -> "当前:未知模式"
}
binding.llCookMode.clickWithDebounce {
SingleFragmentActivity.start(this, SingleFragmentActivity.PageType.COOK_MODE)
}
binding.llSeasoningConfig.clickWithDebounce {
SingleFragmentActivity.start(this, SingleFragmentActivity.PageType.SEASONING_CONFIG)
}
binding.llFoodCollect.clickWithDebounce {
checkCameraPermission()
}
binding.llDbInspect.clickWithDebounce {
SingleFragmentActivity.start(this, SingleFragmentActivity.PageType.DB_INSPECT)
}
binding.llScaleObserve.clickWithDebounce {
startActivity<MasterScaleActivity>()
}
binding.llClearData.clickWithDebounce {
showClearDataDialog()
}
binding.llEnvSwitch.clickWithDebounce {
EnvSwitchDialog(this).show()
}
binding.llTestSeasoning.clickWithDebounce {
startActivity<SubmitFoodActivity> { }
}
binding.rvSettings.layoutManager = LinearLayoutManager(this)
binding.rvSettings.adapter = adapter
// 默认只展示非隐藏项
adapter.submitList(allItems.filter { !it.isHidden })
}
/**
* 构建完整的设置菜单列表,每项的 onClick 直接注入对应业务逻辑
*/
private fun buildAllItems(): List<SettingItem> = listOf(
SettingItem(
type = SettingItem.Type.COOK_MODE,
title = "菜品模式",
subtitle = when (SpTool.cookMode) {
0 -> "当前:制作模式"
1 -> "当前:采样模式"
else -> "当前:未知模式"
},
onClick = {
SingleFragmentActivity.start(this, SingleFragmentActivity.PageType.COOK_MODE)
}
),
SettingItem(
type = SettingItem.Type.SEASONING_CONFIG,
title = "调料区设置",
onClick = {
SingleFragmentActivity.start(this, SingleFragmentActivity.PageType.SEASONING_CONFIG)
}
),
SettingItem(
type = SettingItem.Type.FOOD_COLLECT,
title = "食材采集",
onClick = { checkCameraPermission() }
),
SettingItem(
type = SettingItem.Type.DB_INSPECT,
title = "数据库查看",
isHidden = true,
onClick = {
SingleFragmentActivity.start(this, SingleFragmentActivity.PageType.DB_INSPECT)
}
),
SettingItem(
type = SettingItem.Type.SCALE_OBSERVE,
title = "秤数据监控",
isHidden = true,
onClick = { startActivity<MasterScaleActivity>() }
),
SettingItem(
type = SettingItem.Type.ENV_SWITCH,
title = "切换环境",
isHidden = true,
onClick = { EnvSwitchDialog(this).show() }
),
SettingItem(
type = SettingItem.Type.CLEAR_DATA,
title = "数据清除",
isHidden = true,
onClick = { showClearDataDialog() }
),
SettingItem(
type = SettingItem.Type.TEST_SEASONING,
title = "测试调料拿取",
isHidden = true,
onClick = { startActivity<SubmitFoodActivity> { } }
),
)
/**
* 弹出清除测试数据的二次确认弹窗
*/
@@ -123,12 +153,11 @@ class SettingActivity : BaseActivity() {
}
/**
* 检查相机权限并显示 CollectFragment
* 检查相机权限,有权限则直接打开采集页,否则发起授权请求
*/
@SuppressLint("ObsoleteSdkInt")
private fun checkCameraPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// Android 6.0 以下,直接打开
openCollectPage()
return
}
@@ -137,16 +166,12 @@ class SettingActivity : BaseActivity() {
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
) {
// 权限已授予,直接打开
openCollectPage()
} else {
// 权限未授予,申请权限
requestPermission(Manifest.permission.CAMERA) { isGranted ->
if (isGranted) {
// 权限已授予,直接打开
openCollectPage()
} else {
// 权限被拒绝
showNotGrantedCameraPermissionDialog()
}
}
@@ -168,197 +193,4 @@ class SettingActivity : BaseActivity() {
}
.show()
}
//
// /**
// * 初始化UI和事件监听
// */
// private fun initUI() {
// // 设备配置按钮点击事件
// binding.btnDeviceConfig.setOnClickListener {
// showDeviceConfigFragment()
//
// loadTabStyle(button = binding.btnDeviceConfig, isSelected = true)
// loadTabStyle(button = binding.btnSeasoningConfig, isSelected = false)
// loadTabStyle(button = binding.btnFoodCollect, isSelected = false)
// }
//
// // 调料配置按钮点击事件
// binding.btnSeasoningConfig.setOnClickListener {
// showSeasoningConfigFragment()
//
// loadTabStyle(button = binding.btnDeviceConfig, isSelected = false)
// loadTabStyle(button = binding.btnSeasoningConfig, isSelected = true)
// loadTabStyle(button = binding.btnFoodCollect, isSelected = false)
// }
//
// // 菜品采集按钮点击事件
// binding.btnFoodCollect.setOnClickListener {
// checkCameraPermissionAndShowFragment()
//
// loadTabStyle(button = binding.btnDeviceConfig, isSelected = false)
// loadTabStyle(button = binding.btnSeasoningConfig, isSelected = false)
// loadTabStyle(button = binding.btnFoodCollect, isSelected = true)
// }
//
// // 主设备显示「秤数据监控」入口
// if (GlobalData.deviceRole == DeviceRole.MASTER) {
// binding.btnScaleMonitor.visible()
// binding.btnScaleMonitor.setOnClickListener {
// startActivity<MasterScaleActivity>()
// }
// }
//
// // 初始化按钮颜色(默认设备配置为选中状态)
//
// loadTabStyle(button = binding.btnDeviceConfig, isSelected = true)
// loadTabStyle(button = binding.btnSeasoningConfig, isSelected = false)
// loadTabStyle(button = binding.btnFoodCollect, isSelected = false)
// }
//
// /**
// * 加载顶部Tab按钮样式
// *
// * @param button 按钮
// * @param isSelected 是否选中
// */
// private fun loadTabStyle(button: AppCompatButton, isSelected: Boolean) {
// button.apply {
// if (isSelected){
// // 选中
// setTextColor(Color.WHITE)
// textSize = 28f
// setTypeface(null, android.graphics.Typeface.BOLD)
// background = ContextCompat.getDrawable(this@SettingActivity, R.drawable.bg_btn_underline)
// } else {
// // 未选中
// setTextColor("#5E7585".toColorInt())
// textSize = 26f
// setTypeface(null, android.graphics.Typeface.NORMAL)
// background = null
// }
// }
// }
//
// /**
// * 检查相机权限并显示 CollectFragment
// */
// @SuppressLint("ObsoleteSdkInt")
// private fun checkCameraPermissionAndShowFragment() {
// val collectFragment = fragmentList[2]
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// // Android 6.0 以下,直接显示 Fragment
// showFragment(collectFragment)
// return
// }
// if (ContextCompat.checkSelfPermission(
// this,
// Manifest.permission.CAMERA
// ) == PackageManager.PERMISSION_GRANTED
// ) {
// // 权限已授予,直接显示 Fragment
// showFragment(collectFragment)
// } else {
// // 权限未授予,申请权限
// requestPermission(Manifest.permission.CAMERA) { isGranted ->
// if (isGranted) {
// // 权限已授予,显示 CollectFragment
// showFragment(collectFragment)
// } else {
// // 权限被拒绝
// toast("暂无相机权限,无法使用菜品采集功能")
// }
// }
// }
// }
//
// /**
// * 初始化相机
// * @param container 相机预览容器
// */
// fun initCamera(container: ViewGroup) {
// cameraUtils.initCamera()
// val previewBinding =
// LayoutCameraPreviewBinding.inflate(layoutInflater, container)
// previewView = previewBinding.previewView.also {
// it.updateLayoutParams {
// width = 456.dp
// height = 342.dp
// }
// }
// cameraUtils.setPreviewController(previewView)
// }
//
// /**
// * Activity 恢复时绑定相机
// */
// override fun onResume() {
// super.onResume()
// cameraUtils.bind()
// }
//
// /**
// * Activity 暂停时解绑相机
// */
// override fun onPause() {
// super.onPause()
// cameraUtils.unbind()
// }
//
// /**
// * 提供给 Fragment 调用的拍照方法
// */
// fun takePhoto(succCallback: (Uri) -> Unit, failCallback: (msg: String) -> Unit = {}) {
// cameraUtils.takePhoto(succCallback = succCallback, failCallback = failCallback)
// }
//
// /**
// * 显示设备切换Fragment
// */
// private fun showDeviceConfigFragment() {
// showFragment(fragmentList[0])
// }
//
// /**
// * 显示设调料配置Fragment
// */
// private fun showSeasoningConfigFragment() {
// showFragment(fragmentList[1])
// }
//
// private val fragmentList = mutableListOf<Fragment>().apply {
// add(DeviceConfigFragment())
// add(SeasoningConfigFragment())
// add(CollectFragment())
// }
//
// /**
// * 显示指定的 Fragment
// * 使用 add/show/hide 方式管理 Fragment,避免重复创建
// * 已添加的 Fragment 直接显示,未添加的 Fragment 先添加再显示
// */
// private fun showFragment(fragment: Fragment) {
// runCatching {
// supportFragmentManager.beginTransaction().apply {
// // 如果 Fragment 还未添加到容器中,则添加
// if (!fragment.isAdded) {
// add(binding.fragmentContainer.id, fragment)
// } else {
// // 已添加过,直接显示
// show(fragment)
// }
//
// // 隐藏其他 Fragment
// fragmentList.forEach { otherFragment ->
// if (otherFragment != fragment && otherFragment.isAdded) {
// hide(otherFragment)
// }
// }
//
// commit()
// }
// }.onFailure {
// it.printStackTrace()
// }
// }
}
+8 -321
View File
@@ -5,328 +5,15 @@
android:layout_height="match_parent"
android:orientation="vertical"
tools:background="@color/bg_color"
tools:ignore="HardcodedText,UnusedAttribute">
tools:ignore="UnusedAttribute">
<LinearLayout
android:id="@+id/llCookMode"
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvSettings"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="30dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="菜品模式"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvCurrentMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:textColor="@color/black999"
android:textSize="26sp"
tools:text="当前:制作模式" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llSeasoningConfig"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="50dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="调料区设置"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llFoodCollect"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="50dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="食材采集"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llDbInspect"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="50dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="数据库查看"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llScaleObserve"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="50dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="秤数据监控"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llEnvSwitch"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="50dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="切换环境"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llClearData"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="50dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="数据清除"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/llTestSeasoning"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="50dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:text="测试调料拿取"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>
<!-- &lt;!&ndash; 底部导航菜单 &ndash;&gt;-->
<!-- <LinearLayout-->
<!-- android:id="@+id/bottomMenu"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:orientation="horizontal"-->
<!-- android:background="@android:color/transparent"-->
<!-- android:layout_marginTop="10dp"-->
<!-- android:layout_marginBottom="10dp"-->
<!-- android:layout_marginStart="15dp"-->
<!-- android:layout_marginEnd="15dp"-->
<!-- android:elevation="8dp">-->
<!-- <androidx.appcompat.widget.AppCompatButton-->
<!-- android:id="@+id/btnDeviceConfig"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="70dp"-->
<!-- android:layout_weight="1"-->
<!-- android:text="设备切换"-->
<!-- android:textSize="28sp"-->
<!-- android:textStyle="bold"-->
<!-- android:background="@android:color/transparent" />-->
<!-- <androidx.appcompat.widget.AppCompatButton-->
<!-- android:id="@+id/btnSeasoningConfig"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="70dp"-->
<!-- android:layout_weight="1"-->
<!-- android:text="调料配置"-->
<!-- android:textSize="26sp"-->
<!-- android:background="@android:color/transparent" />-->
<!-- <androidx.appcompat.widget.AppCompatButton-->
<!-- android:id="@+id/btnFoodCollect"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="70dp"-->
<!-- android:layout_weight="1"-->
<!-- android:text="采集食材"-->
<!-- android:textSize="26sp"-->
<!-- android:background="@android:color/transparent" />-->
<!-- <androidx.appcompat.widget.AppCompatButton-->
<!-- android:id="@+id/btnScaleMonitor"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="70dp"-->
<!-- android:layout_weight="1"-->
<!-- android:text="秤数据监控"-->
<!-- android:textSize="26sp"-->
<!-- android:visibility="visible"-->
<!-- android:background="@android:color/transparent" />-->
<!-- </LinearLayout>-->
<!-- &lt;!&ndash; Fragment 容器 &ndash;&gt;-->
<!-- <FrameLayout-->
<!-- android:id="@+id/fragmentContainer"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="0dp"-->
<!-- android:layout_weight="1" />-->
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="30dp"
android:overScrollMode="never"
tools:listitem="@layout/list_item_setting"/>
</LinearLayout>
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="30dp"
android:background="@drawable/shape_white_dc_15_corners"
android:clipToOutline="true"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
tools:ignore="HardcodedText,UnusedAttribute">
<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:textColor="@color/black333"
android:textSize="32sp"
android:textStyle="bold"
tools:text="菜品模式" />
<!-- 副标题,仅部分项目展示(如菜品模式的当前状态) -->
<TextView
android:id="@+id/tvSubtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:textColor="@color/black999"
android:textSize="26sp"
android:visibility="gone"
tools:text="当前:制作模式"
tools:visibility="visible" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:adjustViewBounds="true"
android:src="@drawable/ic_arrow_right3"
tools:ignore="ContentDescription" />
</LinearLayout>