From 77df4a4d8262be33171a24a9a5fdf20257a688c2 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Fri, 17 Apr 2026 14:23:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ui):=20=E7=A7=BB=E9=99=A4=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2=E5=B9=B6=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E8=B0=83=E6=96=99=E9=85=8D=E7=BD=AE=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 DeviceConfigActivity 页面及相关 AndroidManifest 注册 - 将调料配置从单页网格改为上下两层 RecyclerView 结构 - 上层使用 FlexboxLayoutManager 显示 22 格调料位 - 下层使用 GridLayoutManager 显示 18 格调料位 - 更新存储工具类 SpTool 中烹饪模式的访问方式 - 修改首页和初始化页面中烹饪模式的读取逻辑 - 更新 WebSocket 客户端连接逻辑中的重复连接处理 --- app/src/main/AndroidManifest.xml | 4 +- .../dish/match/scale/ScaleWebSocketClient.kt | 2 + .../dish/match/ui/DeviceConfigActivity.kt | 692 +++++++++--------- .../com/shuwei/dish/match/ui/HomeActivity.kt | 4 +- .../com/shuwei/dish/match/ui/InitActivity.kt | 3 +- .../shuwei/dish/match/ui/SettingActivity.kt | 2 +- .../match/ui/fragment/DeviceConfigFragment.kt | 22 +- .../ui/fragment/SeasoningConfigFragment.kt | 69 +- .../com/shuwei/dish/match/utils/SpTool.kt | 6 + .../res/layout/fragment_seasoning_config.xml | 39 +- 10 files changed, 469 insertions(+), 374 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 095ded5..330cdcc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -93,8 +93,8 @@ android:theme="@style/Theme.DishMatch.NoSplash" android:screenOrientation="portrait" tools:ignore="DiscouragedApi,LockedOrientationActivity" /> - + + ( - ModeBean("制作模式", "菜品快速制作,记录熟重"), - ModeBean("采样模式", "菜品快速制作,记录熟重"), - ModeBean("品控模式", "菜品快速制作,记录熟重") - ) - } - - data class ModeBean( - var modeName: String, - var modeDesc: String - ) - - private lateinit var binding: ActivityDeviceConfigBinding - - private lateinit var appViewModel: AppViewModel - - private var cookMode: Int = 0 -// private val weightArray = SparseIntArray() - private val weightArray = SparseArray() - private val addressArray = AddressUtil.getWeighAddressArray() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - binding = ActivityDeviceConfigBinding.inflate(layoutInflater) - setContentView(binding.root) - cookMode = intent.getIntExtra(COOK_MODE, 0) - initViewModel() - setHeaderBackground() - setTitleBar(titleBarAction = { - it.visible() - }, titleAction = { - it.text = "设备配置" - }, rightIconActon = { - it.gone() -// it.alpha = 0.0F -// it.setImageResource(R.drawable.ic_setting) -// it.setOnClickListener {_-> -// detector.setOnDelayedMultiClickListener(it) { -// defaultDataSettingDialog() -// } +//package com.shuwei.dish.match.ui +// +//import android.graphics.Typeface +//import android.os.Bundle +//import android.text.SpannableStringBuilder +//import android.text.style.AbsoluteSizeSpan +//import android.text.style.ForegroundColorSpan +//import android.text.style.LineHeightSpan +//import android.text.style.StyleSpan +//import android.util.Log +//import android.util.SparseArray +//import android.widget.FrameLayout +//import androidx.core.graphics.toColorInt +//import androidx.core.view.forEach +//import androidx.lifecycle.ViewModelProvider +//import com.shuwei.dish.match.base.BaseActivity +//import com.shuwei.dish.match.base.BaseApp +//import com.shuwei.dish.match.db.AppRepository +//import com.shuwei.dish.match.dialog.CommonDialog +//import com.shuwei.dish.match.entity.SeasoningEntity +//import com.shuwei.dish.match.entity.ResetReasoningRecord +//import com.shuwei.dish.match.utils.AddressUtil +//import com.shuwei.dish.match.utils.JsonAssetsLoader +//import com.shuwei.dish.match.utils.MultiClickDetector +//import com.shuwei.dish.match.utils.WeightUtil +//import com.shuwei.dish.match.utils.ext.appendText +//import com.shuwei.dish.match.utils.ext.buildSpannableString +//import com.shuwei.dish.match.utils.ext.dp +//import com.shuwei.dish.match.utils.ext.startActivity +//import com.shuwei.dish.match.utils.ext.toast +//import com.shuwei.dish.match.utils.ext.visible +//import com.shuwei.dish.match.viewmodel.AppViewModel +//import com.shuwei.dish.match.viewmodel.factory.AppFactory +//import com.shuwei.dish.match.adapter.TextCellAdapter +//import com.shuwei.dish.match.databinding.ActivityDeviceConfigBinding +//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() { +// +// companion object { +// +// const val TAG = "DeviceConfigActivity" +// +// const val COOK_MODE = "cookMode" +// +// val modeList = listOf( +// ModeBean("制作模式", "菜品快速制作,记录熟重"), +// ModeBean("采样模式", "菜品快速制作,记录熟重"), +// ModeBean("品控模式", "菜品快速制作,记录熟重") +// ) +// } +// +// data class ModeBean( +// var modeName: String, +// var modeDesc: String +// ) +// +// private lateinit var binding: ActivityDeviceConfigBinding +// +// private lateinit var appViewModel: AppViewModel +// +// private var cookMode: Int = 0 +//// private val weightArray = SparseIntArray() +// private val weightArray = SparseArray() +// private val addressArray = AddressUtil.getWeighAddressArray() +// +// override fun onCreate(savedInstanceState: Bundle?) { +// super.onCreate(savedInstanceState) +// binding = ActivityDeviceConfigBinding.inflate(layoutInflater) +// setContentView(binding.root) +// cookMode = intent.getIntExtra(COOK_MODE, 0) +// initViewModel() +// setHeaderBackground() +// setTitleBar(titleBarAction = { +// it.visible() +// }, titleAction = { +// it.text = "设备配置" +// }, rightIconActon = { +// it.gone() +//// it.alpha = 0.0F +//// it.setImageResource(R.drawable.ic_setting) +//// it.setOnClickListener {_-> +//// detector.setOnDelayedMultiClickListener(it) { +//// defaultDataSettingDialog() +//// } +//// } +// }) +// +// loadQualitySpan(isEnable = false) +// when (cookMode) { +// 1 -> { +// binding.rbModeCook.isChecked = true +// binding.rbModeSampling.isChecked = false +// loadCookSpan(isClicked = true) +// loadSamplingSpan() // } - }) - - loadQualitySpan(isEnable = false) - when (cookMode) { - 1 -> { - binding.rbModeCook.isChecked = true - binding.rbModeSampling.isChecked = false - loadCookSpan(isClicked = true) - loadSamplingSpan() - } - - 2 -> { - binding.rbModeCook.isChecked = false - binding.rbModeSampling.isChecked = true - loadCookSpan() - loadSamplingSpan(isClicked = true) - } - - else -> { - binding.rbModeCook.isChecked = true - binding.rbModeSampling.isChecked = false - loadCookSpan(isClicked = true) - loadSamplingSpan() - } - } - - binding.rbModeCook.setOnClickListener { - SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 0) - binding.rbModeCook.isChecked = true - binding.rbModeSampling.isChecked = false - loadCookSpan(isClicked = true) - loadSamplingSpan() - startActivity { - putExtra(SelectDishActivity.IS_CONFIG_PAGE, true) - } - finish() - } - binding.rbModeSampling.setOnClickListener { - SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 1) - binding.rbModeCook.isChecked = false - binding.rbModeSampling.isChecked = true - loadCookSpan() - loadSamplingSpan(isClicked = true) - startActivity { - putExtra(SamplingListActivity.IS_CONFIG_PAGE, true) } - finish() - } - addWeighListener() - addGridItemListener() - loadSeasoning() - } - - 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 var seasoningItems = mutableListOf() - 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) - } - } - } - - val detector = MultiClickDetector(targetCount = 10, intervalMs = 800) - - private fun defaultDataSettingDialog() { - CommonDialog(this) - .setTitle("温馨提示") - .setContent("您好,使用默认配置作为您的调料数据,则已有配置将被清除,确认吗?") - .setNegativeButton("取消") - .setPositiveButton("确认") { resetList() } - .setOnDismissCallback { hideStatusBar() } - .show() - } - - private fun resetList() { - runCatching { - val record = JsonAssetsLoader.parseJsonFromAssets( - this, - "default_seasoning_list.json" - ) -// val weightArray = WeightUtil.weightArray - appViewModel.clearAllSeasoning { - record?.list?.forEach { entity -> - entity.useWeight = weightArray[addressArray[entity.sort]].toDouble() - appViewModel.saveSeasoning(entity) { - updateGridData(entity) - } - } -// loadSeasoning() - } - }.onFailure { it.printStackTrace() } - } - - private fun initViewModel() { - val db = BaseApp.instance!!.database - val factory = - AppFactory(AppRepository(db.appDao())) - appViewModel = - ViewModelProvider(this, factory)[AppViewModel::class.java] - } - - private fun loadSeasoning() { - appViewModel.loadSeasoning { - seasoningItems.clear() - seasoningItems.addAll(it) - initConfigData() - setGridData(seasoningItems) - } - } - - 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) { - Log.d(TAG, "setGridData: ${list.toJsonString()}") - 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) -// val seasoningEntity = list.first{it.sort == sort} - SeasoningSearchDialog( - activity = this, - 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 - } - } - - private fun loadQualitySpan(isClicked: Boolean = false, isEnable: Boolean = true) { - binding.rbModeQuality.text = - getModeTextSpan( - topText = modeList[2].modeName, - bottomText = modeList[2].modeDesc, - topColor = if (isEnable) if (isClicked) "#00BC71" else "#000000" else "#B4B4B4", - bottomColor = if (isEnable) "#8B8B8B" else "#B4B4B4" - ) - } - - private fun loadSamplingSpan(isClicked: Boolean = false, isEnable: Boolean = true) { - binding.rbModeSampling.text = - getModeTextSpan( - topText = modeList[1].modeName, - bottomText = modeList[1].modeDesc, - topColor = if (isEnable) if (isClicked) "#00BC71" else "#000000" else "#B4B4B4", - bottomColor = if (isEnable) "#8B8B8B" else "#B4B4B4" - ) - } - - private fun loadCookSpan(isClicked: Boolean = false, isEnable: Boolean = true) { - binding.rbModeCook.text = - getModeTextSpan( - topText = modeList[0].modeName, - bottomText = modeList[0].modeDesc, - topColor = if (isEnable) if (isClicked) "#00BC71" else "#000000" else "#B4B4B4", - bottomColor = if (isEnable) "#8B8B8B" else "#B4B4B4" - ) - } - - private fun getModeTextSpan( - topText: String, - topColor: String, - bottomText: String, - bottomColor: String - ): SpannableStringBuilder { - - - return buildSpannableString { - appendText( - topText, - ForegroundColorSpan(topColor.toColorInt()), - StyleSpan(Typeface.BOLD), - AbsoluteSizeSpan(36, true), - LineHeightSpan { text, start, end, spanstartv, v, fm -> - fm.descent += 10.dp // 增加行间距 - } - ) - append("\n") - appendText( - bottomText, - ForegroundColorSpan(bottomColor.toColorInt()), - AbsoluteSizeSpan(26, true) - ) - } - } - - fun saveSeasoning(entity: SeasoningEntity, action: () -> Unit = {}) { - appViewModel.saveSeasoning(entity) { - action() - toast("保存成功") - } - } - -} \ No newline at end of file +// +// 2 -> { +// binding.rbModeCook.isChecked = false +// binding.rbModeSampling.isChecked = true +// loadCookSpan() +// loadSamplingSpan(isClicked = true) +// } +// +// else -> { +// binding.rbModeCook.isChecked = true +// binding.rbModeSampling.isChecked = false +// loadCookSpan(isClicked = true) +// loadSamplingSpan() +// } +// } +// +// binding.rbModeCook.setOnClickListener { +// SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 0) +// binding.rbModeCook.isChecked = true +// binding.rbModeSampling.isChecked = false +// loadCookSpan(isClicked = true) +// loadSamplingSpan() +// startActivity { +// putExtra(SelectDishActivity.IS_CONFIG_PAGE, true) +// } +// finish() +// } +// binding.rbModeSampling.setOnClickListener { +// SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 1) +// binding.rbModeCook.isChecked = false +// binding.rbModeSampling.isChecked = true +// loadCookSpan() +// loadSamplingSpan(isClicked = true) +// startActivity { +// putExtra(SamplingListActivity.IS_CONFIG_PAGE, true) } +// finish() +// } +// addWeighListener() +// addGridItemListener() +// loadSeasoning() +// } +// +// 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 var seasoningItems = mutableListOf() +// 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) +// } +// } +// } +// +// val detector = MultiClickDetector(targetCount = 10, intervalMs = 800) +// +// private fun defaultDataSettingDialog() { +// CommonDialog(this) +// .setTitle("温馨提示") +// .setContent("您好,使用默认配置作为您的调料数据,则已有配置将被清除,确认吗?") +// .setNegativeButton("取消") +// .setPositiveButton("确认") { resetList() } +// .setOnDismissCallback { hideStatusBar() } +// .show() +// } +// +// private fun resetList() { +// runCatching { +// val record = JsonAssetsLoader.parseJsonFromAssets( +// this, +// "default_seasoning_list.json" +// ) +//// val weightArray = WeightUtil.weightArray +// appViewModel.clearAllSeasoning { +// record?.list?.forEach { entity -> +// entity.useWeight = weightArray[addressArray[entity.sort]].toDouble() +// appViewModel.saveSeasoning(entity) { +// updateGridData(entity) +// } +// } +//// loadSeasoning() +// } +// }.onFailure { it.printStackTrace() } +// } +// +// private fun initViewModel() { +// val db = BaseApp.instance!!.database +// val factory = +// AppFactory(AppRepository(db.appDao())) +// appViewModel = +// ViewModelProvider(this, factory)[AppViewModel::class.java] +// } +// +// private fun loadSeasoning() { +// appViewModel.loadSeasoning { +// seasoningItems.clear() +// seasoningItems.addAll(it) +// initConfigData() +// setGridData(seasoningItems) +// } +// } +// +// 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) { +// Log.d(TAG, "setGridData: ${list.toJsonString()}") +// 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) +//// val seasoningEntity = list.first{it.sort == sort} +// SeasoningSearchDialog( +// activity = this, +// 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 +// } +// } +// +// private fun loadQualitySpan(isClicked: Boolean = false, isEnable: Boolean = true) { +// binding.rbModeQuality.text = +// getModeTextSpan( +// topText = modeList[2].modeName, +// bottomText = modeList[2].modeDesc, +// topColor = if (isEnable) if (isClicked) "#00BC71" else "#000000" else "#B4B4B4", +// bottomColor = if (isEnable) "#8B8B8B" else "#B4B4B4" +// ) +// } +// +// private fun loadSamplingSpan(isClicked: Boolean = false, isEnable: Boolean = true) { +// binding.rbModeSampling.text = +// getModeTextSpan( +// topText = modeList[1].modeName, +// bottomText = modeList[1].modeDesc, +// topColor = if (isEnable) if (isClicked) "#00BC71" else "#000000" else "#B4B4B4", +// bottomColor = if (isEnable) "#8B8B8B" else "#B4B4B4" +// ) +// } +// +// private fun loadCookSpan(isClicked: Boolean = false, isEnable: Boolean = true) { +// binding.rbModeCook.text = +// getModeTextSpan( +// topText = modeList[0].modeName, +// bottomText = modeList[0].modeDesc, +// topColor = if (isEnable) if (isClicked) "#00BC71" else "#000000" else "#B4B4B4", +// bottomColor = if (isEnable) "#8B8B8B" else "#B4B4B4" +// ) +// } +// +// private fun getModeTextSpan( +// topText: String, +// topColor: String, +// bottomText: String, +// bottomColor: String +// ): SpannableStringBuilder { +// +// +// return buildSpannableString { +// appendText( +// topText, +// ForegroundColorSpan(topColor.toColorInt()), +// StyleSpan(Typeface.BOLD), +// AbsoluteSizeSpan(36, true), +// LineHeightSpan { text, start, end, spanstartv, v, fm -> +// fm.descent += 10.dp // 增加行间距 +// } +// ) +// append("\n") +// appendText( +// bottomText, +// ForegroundColorSpan(bottomColor.toColorInt()), +// AbsoluteSizeSpan(26, true) +// ) +// } +// } +// +// fun saveSeasoning(entity: SeasoningEntity, action: () -> Unit = {}) { +// appViewModel.saveSeasoning(entity) { +// action() +// toast("保存成功") +// } +// } +// +//} \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt index ccb1d31..5b1ec1b 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt @@ -107,7 +107,7 @@ class HomeActivity : BaseActivity() { modeDesc = "菜品快速制作,记录熟重", modeIconId = R.drawable.ic_mode_cook, onClick = { - SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 0) + SpTool.cookMode = 0 startActivity() finish() }) @@ -118,7 +118,7 @@ class HomeActivity : BaseActivity() { modeDesc = "菜品快速制作,记录熟重", modeIconId = R.drawable.ic_mode_sampling, onClick = { - SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 1) + SpTool.cookMode = 1 goSampling() }) ) diff --git a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt index b6b4258..a43cef0 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt @@ -83,8 +83,7 @@ class InitActivity : BaseActivity() { return@launch } // 主设备:走原有路由逻辑 - val launchPageType = SpTool.getInt(SpTool.LAUNCH_PAGE_TYPE, -1) - when (launchPageType) { + when (SpTool.cookMode) { 0 -> { startActivity() } 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 a6d10ff..2587ed5 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 @@ -231,7 +231,7 @@ class SettingActivity : BaseActivity() { } private val fragmentList = mutableListOf().apply { - add(DeviceConfigFragment.newInstance()) + add(DeviceConfigFragment()) add(SeasoningConfigFragment()) add(CollectFragment()) } 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 581efff..694b6ee 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 @@ -51,21 +51,11 @@ class DeviceConfigFragment : BaseFragment() { companion object { const val TAG = "DeviceConfigFragment" - const val COOK_MODE = "cookMode" - val modeList = listOf( ModeBean("制作模式", "菜品快速制作,记录熟重"), ModeBean("采样模式", "菜品快速制作,记录熟重"), ModeBean("品控模式", "菜品快速制作,记录熟重") ) - - fun newInstance(cookMode: Int = 0): DeviceConfigFragment { - return DeviceConfigFragment().apply { - arguments = Bundle().apply { - putInt(COOK_MODE, cookMode) - } - } - } } data class ModeBean( @@ -75,7 +65,6 @@ class DeviceConfigFragment : BaseFragment() { // private lateinit var appViewModel: AppViewModel - private var cookMode: Int = 0 private val weightArray = SparseArray() private val addressArray = AddressUtil.getWeighAddressArray() private var seasoningItems = mutableListOf() @@ -89,7 +78,6 @@ class DeviceConfigFragment : BaseFragment() { } override fun initialize(){ - cookMode = arguments?.getInt(COOK_MODE, 0) ?: 0 initViewModel() initUI() // addWeighListener() @@ -111,15 +99,15 @@ class DeviceConfigFragment : BaseFragment() { */ private fun initUI() { loadQualitySpan(isEnable = false) - when (cookMode) { - 1 -> { + when (SpTool.cookMode) { + 0 -> { binding.rbModeCook.isChecked = true binding.rbModeSampling.isChecked = false loadCookSpan(isClicked = true) loadSamplingSpan() } - 2 -> { + 1 -> { binding.rbModeCook.isChecked = false binding.rbModeSampling.isChecked = true loadCookSpan() @@ -135,7 +123,7 @@ class DeviceConfigFragment : BaseFragment() { } binding.rbModeCook.setOnClickListener { - SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 0) + SpTool.cookMode = 0 binding.rbModeCook.isChecked = true binding.rbModeSampling.isChecked = false loadCookSpan(isClicked = true) @@ -146,7 +134,7 @@ class DeviceConfigFragment : BaseFragment() { activity?.finish() } binding.rbModeSampling.setOnClickListener { - SpTool.put(SpTool.LAUNCH_PAGE_TYPE, 1) + SpTool.cookMode = 1 binding.rbModeCook.isChecked = false binding.rbModeSampling.isChecked = true loadCookSpan() 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 index 3000923..2e35dbf 100644 --- 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 @@ -2,21 +2,86 @@ package com.shuwei.dish.match.ui.fragment import android.view.LayoutInflater import android.view.ViewGroup +import androidx.recyclerview.widget.GridLayoutManager +import com.google.android.flexbox.AlignItems +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager +import com.shuwei.dish.match.adapter.Seasoning18GridAdapter +import com.shuwei.dish.match.adapter.Seasoning22GridAdapter import com.shuwei.dish.match.base.BaseFragment import com.shuwei.dish.match.databinding.FragmentSeasoningConfigBinding import com.shuwei.dish.match.ui.SettingActivity +import com.shuwei.dish.match.utils.ext.dp class SeasoningConfigFragment : BaseFragment() { + override fun inflateBinding( inflater: LayoutInflater, container: ViewGroup? ) = FragmentSeasoningConfigBinding.inflate(inflater, container, false) - private lateinit var settingActivity: SettingActivity +// private lateinit var appViewModel: AppViewModel + + private val adapter22 by lazy { buildAdapter22() } + private val adapter18 by lazy { Seasoning18GridAdapter() } + override fun initialize() { settingActivity = activity as SettingActivity +// initViewModel() + setupRecyclerViews() + loadData() } +// /** 初始化 ViewModel */ +// private fun initViewModel() { +// val factory = AppFactory(AppRepository(BaseApp.instance!!.database.appDao())) +// appViewModel = ViewModelProvider(this, factory)[AppViewModel::class.java] +// } -} \ No newline at end of file + /** 构建上层(22格)Adapter,需要先计算格子尺寸 */ + private fun buildAdapter22(): Seasoning22GridAdapter { + val usable = resources.displayMetrics.widthPixels - 8 * 4.dp - 10.dp + val smallSize = usable / 9 + val largeSize = (usable - smallSize * 6) / 2 + return Seasoning22GridAdapter(largeSize, smallSize) + } + + /** 配置两个 RecyclerView */ + private fun setupRecyclerViews() { + // 上层:FlexboxLayoutManager,仿 MasterScaleActivity 中 Scale22VH 的布局方式 + // rvTop 高度 = 小格子尺寸 * 3行 + 3 * 间距,与 Scale22VH 保持一致 + val screenWidth = resources.displayMetrics.widthPixels + val usable = screenWidth - 8 * 4.dp - 10.dp + val smallSize = usable / 9 + val rvTopHeight = smallSize * 3 + 3 * 4.dp + binding.rvTop.apply { + layoutParams = layoutParams.also { it.height = rvTopHeight } + layoutManager = FlexboxLayoutManager(requireContext()).apply { + flexDirection = FlexDirection.COLUMN + flexWrap = FlexWrap.WRAP + alignItems = AlignItems.FLEX_START + } + itemAnimator = null + adapter = adapter22 + } + + // 下层:GridLayoutManager 6列,仿 Scale18VH + binding.rvBottom.apply { + layoutManager = GridLayoutManager(requireContext(), 6) + itemAnimator = null + adapter = adapter18 + } + } + + /** 加载默认空数据,使两个列表完整展示所有格子 */ + private fun loadData() { + adapter22.update(emptyList()) + adapter18.update(emptyList()) +// appViewModel.loadSeasoning { list -> +// adapter22.update(list ?: emptyList()) +// adapter18.update(list ?: emptyList()) +// } + } +} diff --git a/app/src/main/java/com/shuwei/dish/match/utils/SpTool.kt b/app/src/main/java/com/shuwei/dish/match/utils/SpTool.kt index 28d0f0f..f3d855f 100644 --- a/app/src/main/java/com/shuwei/dish/match/utils/SpTool.kt +++ b/app/src/main/java/com/shuwei/dish/match/utils/SpTool.kt @@ -31,4 +31,10 @@ object SpTool { fun getBoolean(key: String, defValue: Boolean = false): Boolean { return pref.getBoolean(key, defValue) } + + var cookMode: Int + get() = getInt(LAUNCH_PAGE_TYPE, -1) + set(value) { + put(LAUNCH_PAGE_TYPE, value) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_seasoning_config.xml b/app/src/main/res/layout/fragment_seasoning_config.xml index 8139ec1..a4409a6 100644 --- a/app/src/main/res/layout/fragment_seasoning_config.xml +++ b/app/src/main/res/layout/fragment_seasoning_config.xml @@ -1,7 +1,42 @@ - - \ No newline at end of file + + + + + + + + +