From c35572dc41873a82aebd2c1aa9528ab59308d5e0 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Fri, 17 Apr 2026 11:45:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(setting):=20=E6=B7=BB=E5=8A=A0=E8=B0=83?= =?UTF-8?q?=E6=96=99=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=95=8C=E9=9D=A2=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在设置页面添加调料配置按钮和设备切换功能 - 将设备配置页面标题从"设备配置"改为"设备切换" - 新增SeasoningConfigFragment调料配置片段 - 将秤数据监控按钮可见性从gone改为visible - 优化collectFragment布局加载方式 - 在DeviceConfigActivity中添加调试日志输出 - 重构SettingActivity中的按钮样式管理逻辑 - 调整fragment列表顺序和点击事件处理 - 修改列表项高度以改善界面显示效果 - 注释掉DeviceConfigFragment中未使用的viewModel相关代码 --- .../dish/match/ui/DeviceConfigActivity.kt | 2 + .../shuwei/dish/match/ui/SettingActivity.kt | 94 +++--- .../dish/match/ui/fragment/CollectFragment.kt | 2 +- .../match/ui/fragment/DeviceConfigFragment.kt | 280 +++++++++--------- .../ui/fragment/SeasoningConfigFragment.kt | 22 ++ app/src/main/res/layout/activity_setting.xml | 13 +- .../res/layout/fragment_device_config.xml | 6 +- .../res/layout/fragment_seasoning_config.xml | 7 + .../main/res/layout/list_item_scale_row.xml | 2 +- 9 files changed, 236 insertions(+), 192 deletions(-) create mode 100644 app/src/main/java/com/shuwei/dish/match/ui/fragment/SeasoningConfigFragment.kt create mode 100644 app/src/main/res/layout/fragment_seasoning_config.xml diff --git a/app/src/main/java/com/shuwei/dish/match/ui/DeviceConfigActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/DeviceConfigActivity.kt index 0d691fb..a686841 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/DeviceConfigActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/DeviceConfigActivity.kt @@ -37,6 +37,7 @@ import com.shuwei.dish.match.dialog.SeasoningSearchDialog import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.gone +import com.shuwei.dish.match.utils.ext.toJsonString class DeviceConfigActivity : BaseActivity() { @@ -223,6 +224,7 @@ class DeviceConfigActivity : BaseActivity() { } private fun setGridData(list: MutableList) { + Log.d(TAG, "setGridData: ${list.toJsonString()}") val gridLayout = binding.include.root list.forEach { entity -> val tag = entity.sort.toString() diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt index 6e9c3d7..a6d10ff 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt @@ -3,10 +3,12 @@ package com.shuwei.dish.match.ui import android.Manifest import android.annotation.SuppressLint import android.content.pm.PackageManager +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.Bundle import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatButton import androidx.core.content.ContextCompat import androidx.core.graphics.toColorInt import androidx.fragment.app.Fragment @@ -20,6 +22,7 @@ import com.shuwei.dish.match.databinding.ActivitySettingBinding import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding import com.shuwei.dish.match.ui.fragment.CollectFragment import com.shuwei.dish.match.ui.fragment.DeviceConfigFragment +import com.shuwei.dish.match.ui.fragment.SeasoningConfigFragment import com.shuwei.dish.match.utils.CameraUtils import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.ext.dp @@ -72,18 +75,29 @@ class SettingActivity : BaseActivity() { // 设备配置按钮点击事件 binding.btnDeviceConfig.setOnClickListener { showDeviceConfigFragment() - updateButtonColors(isDeviceConfigSelected = true) + + 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() - updateButtonColors(isDeviceConfigSelected = false) - } -// // 设备角色只读展示,角色由设备 ID 决定,不可手动切换 -// updateRoleButtonText() -// binding.btnDeviceRole.isEnabled = false + loadTabStyle(button = binding.btnDeviceConfig, isSelected = false) + loadTabStyle(button = binding.btnSeasoningConfig, isSelected = false) + loadTabStyle(button = binding.btnFoodCollect, isSelected = true) + } // 主设备显示「秤数据监控」入口 if (GlobalData.deviceRole == DeviceRole.MASTER) { @@ -94,7 +108,10 @@ class SettingActivity : BaseActivity() { } // 初始化按钮颜色(默认设备配置为选中状态) - updateButtonColors(isDeviceConfigSelected = true) + + loadTabStyle(button = binding.btnDeviceConfig, isSelected = true) + loadTabStyle(button = binding.btnSeasoningConfig, isSelected = false) + loadTabStyle(button = binding.btnFoodCollect, isSelected = false) } // /** 刷新角色按钮文字 */ @@ -104,43 +121,26 @@ class SettingActivity : BaseActivity() { // } /** - * 更新底部菜单按钮的颜色状态 - * @param isDeviceConfigSelected 设备配置按钮是否被选中 + * 加载顶部Tab按钮样式 + * + * @param button 按钮 + * @param isSelected 是否选中 */ - private fun updateButtonColors(isDeviceConfigSelected: Boolean) { - val selectedColor = "#FFFFFF".toColorInt() // 选中颜色(白色) - val unselectedColor = "#5E7585".toColorInt() // 未选中颜色(灰色) - - if (isDeviceConfigSelected) { - // 设备配置按钮:选中状态 - binding.btnDeviceConfig.apply { - setTextColor(selectedColor) + 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) - } - // 采集食材按钮:未选中状态 - binding.btnFoodCollect.apply { - setTextColor(unselectedColor) + } else { + // 未选中 + setTextColor("#5E7585".toColorInt()) textSize = 26f setTypeface(null, android.graphics.Typeface.NORMAL) background = null } - } else { - // 设备配置按钮:未选中状态 - binding.btnDeviceConfig.apply { - setTextColor(unselectedColor) - textSize = 26f - setTypeface(null, android.graphics.Typeface.NORMAL) - background = null - } - // 采集食材按钮:选中状态 - binding.btnFoodCollect.apply { - setTextColor(selectedColor) - textSize = 28f - setTypeface(null, android.graphics.Typeface.BOLD) - background = ContextCompat.getDrawable(this@SettingActivity, R.drawable.bg_btn_underline) - } } } @@ -149,9 +149,10 @@ class SettingActivity : BaseActivity() { */ @SuppressLint("ObsoleteSdkInt") private fun checkCameraPermissionAndShowFragment() { + val collectFragment = fragmentList[2] if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { // Android 6.0 以下,直接显示 Fragment - showFragment(fragmentList[1]) + showFragment(collectFragment) return } if (ContextCompat.checkSelfPermission( @@ -160,13 +161,13 @@ class SettingActivity : BaseActivity() { ) == PackageManager.PERMISSION_GRANTED ) { // 权限已授予,直接显示 Fragment - showFragment(fragmentList[1]) + showFragment(collectFragment) } else { // 权限未授予,申请权限 requestPermission(Manifest.permission.CAMERA) { isGranted -> if (isGranted) { // 权限已授予,显示 CollectFragment - showFragment(fragmentList[1]) + showFragment(collectFragment) } else { // 权限被拒绝 toast("暂无相机权限,无法使用菜品采集功能") @@ -216,19 +217,22 @@ class SettingActivity : BaseActivity() { } /** - * 显示设备配置Fragment + * 显示设备切换Fragment */ private fun showDeviceConfigFragment() { -// val fragment = DeviceConfigFragment.newInstance() -// supportFragmentManager.beginTransaction() -// .replace(binding.fragmentContainer.id, fragment) -// .addToBackStack(null) -// .commit() showFragment(fragmentList[0]) } + /** + * 显示设调料配置Fragment + */ + private fun showSeasoningConfigFragment() { + showFragment(fragmentList[1]) + } + private val fragmentList = mutableListOf().apply { add(DeviceConfigFragment.newInstance()) + add(SeasoningConfigFragment()) add(CollectFragment()) } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt b/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt index 25177cc..d4d01c3 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt @@ -82,7 +82,7 @@ class CollectFragment : BaseFragment() { inflater: LayoutInflater, container: ViewGroup? ): FragmentCollectBinding { - return FragmentCollectBinding.inflate(LayoutInflater.from(context)) + return FragmentCollectBinding.inflate(inflater, container, false) } //typealias CameraCallback = (Uri) -> Unit diff --git a/app/src/main/java/com/shuwei/dish/match/ui/fragment/DeviceConfigFragment.kt b/app/src/main/java/com/shuwei/dish/match/ui/fragment/DeviceConfigFragment.kt index 1e85457..581efff 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/fragment/DeviceConfigFragment.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/fragment/DeviceConfigFragment.kt @@ -73,7 +73,7 @@ class DeviceConfigFragment : BaseFragment() { var modeDesc: String ) - private lateinit var appViewModel: AppViewModel +// private lateinit var appViewModel: AppViewModel private var cookMode: Int = 0 private val weightArray = SparseArray() @@ -92,18 +92,18 @@ class DeviceConfigFragment : BaseFragment() { cookMode = arguments?.getInt(COOK_MODE, 0) ?: 0 initViewModel() initUI() - addWeighListener() - addGridItemListener() - loadSeasoning() +// addWeighListener() +// addGridItemListener() +// loadSeasoning() } /** * 初始化ViewModel */ private fun initViewModel() { - val db = BaseApp.instance!!.database - val factory = AppFactory(AppRepository(db.appDao())) - appViewModel = ViewModelProvider(this, factory)[AppViewModel::class.java] +// val db = BaseApp.instance!!.database +// val factory = AppFactory(AppRepository(db.appDao())) +// appViewModel = ViewModelProvider(this, factory)[AppViewModel::class.java] } /** @@ -156,138 +156,138 @@ class DeviceConfigFragment : BaseFragment() { activity?.finish() } } - - /** - * 添加称重监听 - */ - private fun addWeighListener() { - WeightUtil.addWeightListener( - weightKey = TAG, - getWeight = { address, state, weight -> - Log.d(TAG, "addWeighListener: address=$address,stat=$state,weight=$weight") - weightArray.put(address, weight) - val item = seasoningItems.firstOrNull { address == addressArray[it.sort] } - item?.let { - it.useWeight = weight.toDouble() - updateGridData(it) - } - Log.d(TAG, "addWeighListener: update-----------------------") - }) - } - - /** - * 添加网格项点击监听 - */ - private fun addGridItemListener() { - binding.include.root.forEach { child -> - child.clickWithDebounce { - val sort = child.tag.toString().toInt() - val entity = seasoningItems.firstOrNull { it.sort == sort } ?: SeasoningEntity() - clickGridItem(sort, entity) - } - } - } - - /** - * 加载调料数据 - */ - private fun loadSeasoning() { - appViewModel.loadSeasoning { - seasoningItems.clear() - seasoningItems.addAll(it) - initConfigData() - setGridData(seasoningItems) - } - } - - /** - * 初始化配置数据,确保有12个调料位置 - */ - private fun initConfigData() { - repeat(12) { num -> - val firstOne = seasoningItems.firstOrNull { it.sort == num } - if (firstOne == null) { - seasoningItems.add(SeasoningEntity().also { it.sort = num }) - } - } - } - - /** - * 设置网格数据 - */ - private fun setGridData(list: MutableList) { - val gridLayout = binding.include.root - list.forEach { entity -> - val tag = entity.sort.toString() - val frameLayout = gridLayout.findViewWithTag(tag) - TextCellAdapter.loadLayout(frameLayout, entity) - } - } - - /** - * 更新网格数据 - */ - private fun updateGridData(entity: SeasoningEntity) { - val gridLayout = binding.include.root - val tag = entity.sort.toString() - val frameLayout = gridLayout.findViewWithTag(tag) - TextCellAdapter.loadLayout(frameLayout, entity) - } - - /** - * 点击网格项,打开调料搜索对话框 - */ - private fun clickGridItem(sort: Int, entity: SeasoningEntity) { - val currentAddress = AddressUtil.getWeighAddressArray().get(sort) - SeasoningSearchDialog( - activity = requireActivity() as BaseActivity, - weighIndex = sort, - weighAddress = currentAddress, - clickName = entity.goodsName - ) { item -> - syncItem(entity, item) - // 3-调料 - entity.materialType = 3 - entity.sort = sort - saveSeasoning(entity) { - val tag = sort.toString() - val gridLayout = binding.include.root - val frameLayout = gridLayout.findViewWithTag(tag) - TextCellAdapter.loadLayout(frameLayout, entity) - } - }.show() - } - - /** - * 同步调料项数据 - */ - private fun syncItem(oldItem: SeasoningEntity, newItem: SeasoningEntity) { - oldItem.run { - goodsId = newItem.goodsId - goodsName = newItem.goodsName - goodsOrRelationCode = newItem.goodsOrRelationCode - relateionType = newItem.relateionType - materialType = newItem.materialType - allEdible = newItem.allEdible - useWeight = newItem.useWeight - popularName = newItem.popularName - canteenId = newItem.canteenId - relateionType_dictText = newItem.relateionType_dictText - - foodId = newItem.foodId - sort = newItem.sort - } - } - - /** - * 保存调料数据 - */ - fun saveSeasoning(entity: SeasoningEntity, action: () -> Unit = {}) { - appViewModel.saveSeasoning(entity) { - action() - toast("保存成功") - } - } +// +// /** +// * 添加称重监听 +// */ +// private fun addWeighListener() { +// WeightUtil.addWeightListener( +// weightKey = TAG, +// getWeight = { address, state, weight -> +// Log.d(TAG, "addWeighListener: address=$address,stat=$state,weight=$weight") +// weightArray.put(address, weight) +// val item = seasoningItems.firstOrNull { address == addressArray[it.sort] } +// item?.let { +// it.useWeight = weight.toDouble() +// updateGridData(it) +// } +// Log.d(TAG, "addWeighListener: update-----------------------") +// }) +// } +// +// /** +// * 添加网格项点击监听 +// */ +// private fun addGridItemListener() { +// binding.include.root.forEach { child -> +// child.clickWithDebounce { +// val sort = child.tag.toString().toInt() +// val entity = seasoningItems.firstOrNull { it.sort == sort } ?: SeasoningEntity() +// clickGridItem(sort, entity) +// } +// } +// } +// +// /** +// * 加载调料数据 +// */ +// private fun loadSeasoning() { +//// appViewModel.loadSeasoning { +//// seasoningItems.clear() +//// seasoningItems.addAll(it) +//// initConfigData() +//// setGridData(seasoningItems) +//// } +// } +// +// /** +// * 初始化配置数据,确保有12个调料位置 +// */ +// private fun initConfigData() { +// repeat(12) { num -> +// val firstOne = seasoningItems.firstOrNull { it.sort == num } +// if (firstOne == null) { +// seasoningItems.add(SeasoningEntity().also { it.sort = num }) +// } +// } +// } +// +// /** +// * 设置网格数据 +// */ +// private fun setGridData(list: MutableList) { +// val gridLayout = binding.include.root +// list.forEach { entity -> +// val tag = entity.sort.toString() +// val frameLayout = gridLayout.findViewWithTag(tag) +// TextCellAdapter.loadLayout(frameLayout, entity) +// } +// } +// +// /** +// * 更新网格数据 +// */ +// private fun updateGridData(entity: SeasoningEntity) { +// val gridLayout = binding.include.root +// val tag = entity.sort.toString() +// val frameLayout = gridLayout.findViewWithTag(tag) +// TextCellAdapter.loadLayout(frameLayout, entity) +// } +// +// /** +// * 点击网格项,打开调料搜索对话框 +// */ +// private fun clickGridItem(sort: Int, entity: SeasoningEntity) { +// val currentAddress = AddressUtil.getWeighAddressArray().get(sort) +// SeasoningSearchDialog( +// activity = requireActivity() as BaseActivity, +// weighIndex = sort, +// weighAddress = currentAddress, +// clickName = entity.goodsName +// ) { item -> +// syncItem(entity, item) +// // 3-调料 +// entity.materialType = 3 +// entity.sort = sort +// saveSeasoning(entity) { +// val tag = sort.toString() +// val gridLayout = binding.include.root +// val frameLayout = gridLayout.findViewWithTag(tag) +// TextCellAdapter.loadLayout(frameLayout, entity) +// } +// }.show() +// } +// +// /** +// * 同步调料项数据 +// */ +// private fun syncItem(oldItem: SeasoningEntity, newItem: SeasoningEntity) { +// oldItem.run { +// goodsId = newItem.goodsId +// goodsName = newItem.goodsName +// goodsOrRelationCode = newItem.goodsOrRelationCode +// relateionType = newItem.relateionType +// materialType = newItem.materialType +// allEdible = newItem.allEdible +// useWeight = newItem.useWeight +// popularName = newItem.popularName +// canteenId = newItem.canteenId +// relateionType_dictText = newItem.relateionType_dictText +// +// foodId = newItem.foodId +// sort = newItem.sort +// } +// } +// +// /** +// * 保存调料数据 +// */ +// fun saveSeasoning(entity: SeasoningEntity, action: () -> Unit = {}) { +// appViewModel.saveSeasoning(entity) { +// action() +// toast("保存成功") +// } +// } /** * 加载品控模式文本样式 @@ -359,6 +359,6 @@ class DeviceConfigFragment : BaseFragment() { override fun onDestroyView() { super.onDestroyView() // 移除称重监听 - WeightUtil.removeWeightListener(TAG) +// WeightUtil.removeWeightListener(TAG) } } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/fragment/SeasoningConfigFragment.kt b/app/src/main/java/com/shuwei/dish/match/ui/fragment/SeasoningConfigFragment.kt new file mode 100644 index 0000000..3000923 --- /dev/null +++ b/app/src/main/java/com/shuwei/dish/match/ui/fragment/SeasoningConfigFragment.kt @@ -0,0 +1,22 @@ +package com.shuwei.dish.match.ui.fragment + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.shuwei.dish.match.base.BaseFragment +import com.shuwei.dish.match.databinding.FragmentSeasoningConfigBinding +import com.shuwei.dish.match.ui.SettingActivity + +class SeasoningConfigFragment : BaseFragment() { + override fun inflateBinding( + inflater: LayoutInflater, + container: ViewGroup? + ) = FragmentSeasoningConfigBinding.inflate(inflater, container, false) + + + private lateinit var settingActivity: SettingActivity + override fun initialize() { + settingActivity = activity as SettingActivity + } + + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index c3b0d8d..82faa61 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -23,11 +23,20 @@ android:layout_width="0dp" android:layout_height="70dp" android:layout_weight="1" - android:text="设备配置" + android:text="设备切换" android:textSize="28sp" android:textStyle="bold" android:background="@android:color/transparent" /> + + diff --git a/app/src/main/res/layout/fragment_device_config.xml b/app/src/main/res/layout/fragment_device_config.xml index b59e5cb..1bfe6e1 100644 --- a/app/src/main/res/layout/fragment_device_config.xml +++ b/app/src/main/res/layout/fragment_device_config.xml @@ -10,8 +10,7 @@ + android:layout_marginEnd="30dp" + android:visibility="gone"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_scale_row.xml b/app/src/main/res/layout/list_item_scale_row.xml index 4fc9caf..7c659b3 100644 --- a/app/src/main/res/layout/list_item_scale_row.xml +++ b/app/src/main/res/layout/list_item_scale_row.xml @@ -3,7 +3,7 @@