From 1cbad71eaffc9c1d4f492aa81607392753e06287 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Tue, 31 Mar 2026 18:12:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(dialog):=20=E6=B7=BB=E5=8A=A0=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=88=87=E6=8D=A2=E5=AF=B9=E8=AF=9D=E6=A1=86=E5=B9=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8C=85=E5=90=8D=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 BaseDialog 抽象基类,统一对话框样式和行为 - 新增 EnvSwitchDialog 支持 TEST/UAT/PROD 三环境切换 - 修复 BaseDialog 和 EnvSwitchDialog 的包名(com.shuwei.intelligent.shelves → com.sw.platecabinet) - 新增 View.hideKeyboard() 扩展函数到 CommonExt.kt - 重构 GlobalData 环境 URL 常量命名(TEST_URL/PRO_URL → TEST_BASE_URL/UAT_BASE_URL/PROD_BASE_URL) - MyApp 启动时从 SpTool 读取已保存的环境配置 - SpTool 新增 baseUrl 持久化支持 - 修正 drawable 资源颜色引用为硬编码值 Co-Authored-By: Claude Sonnet 4.6 --- .../java/com/sw/platecabinet/GlobalData.kt | 12 +- .../main/java/com/sw/platecabinet/MyApp.kt | 12 +- .../com/sw/platecabinet/dialog/BaseDialog.kt | 38 +++++++ .../sw/platecabinet/dialog/EnvSwitchDialog.kt | 69 ++++++++++++ .../java/com/sw/platecabinet/ext/CommonExt.kt | 10 ++ .../java/com/sw/platecabinet/utils/SpTool.kt | 7 ++ app/src/main/res/drawable/bg_cancel.xml | 14 +++ app/src/main/res/drawable/bg_confirm.xml | 11 ++ .../main/res/drawable/bg_white_radius12.xml | 6 + app/src/main/res/layout/dialog_env_switch.xml | 106 ++++++++++++++++++ 10 files changed, 280 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/sw/platecabinet/dialog/BaseDialog.kt create mode 100644 app/src/main/java/com/sw/platecabinet/dialog/EnvSwitchDialog.kt create mode 100644 app/src/main/res/drawable/bg_cancel.xml create mode 100644 app/src/main/res/drawable/bg_confirm.xml create mode 100644 app/src/main/res/drawable/bg_white_radius12.xml create mode 100644 app/src/main/res/layout/dialog_env_switch.xml diff --git a/app/src/main/java/com/sw/platecabinet/GlobalData.kt b/app/src/main/java/com/sw/platecabinet/GlobalData.kt index b8cd872..cd9ceed 100644 --- a/app/src/main/java/com/sw/platecabinet/GlobalData.kt +++ b/app/src/main/java/com/sw/platecabinet/GlobalData.kt @@ -34,10 +34,13 @@ object GlobalData { * 具体业务baseurl */ var appBaseUrl: String = "" - //测试环境 - const val TEST_URL: String = "http://192.168.1.201:14801" - //生产环境 - const val PRO_URL: String = "https://dev.yixiong-tech.com:8081" + + /** + * 具体业务 BaseUrl + */ + const val TEST_BASE_URL: String = "http://192.168.1.201:14801" + const val UAT_BASE_URL: String = "https://dev.yixiong-tech.com:8081" + const val PROD_BASE_URL: String = "https://api.dm.yixiong-tech.com:8443" /** * 设备id @@ -65,4 +68,5 @@ object GlobalKey { const val KEY_FIRST_RUN = "firstRun" const val KEY_USER_INFO = "userInfoKey" const val PARAM_EQUIPMENT_INFO = "equipmentUserInfo" + const val KEY_BASE_URL = "baseUrlKey" } \ No newline at end of file diff --git a/app/src/main/java/com/sw/platecabinet/MyApp.kt b/app/src/main/java/com/sw/platecabinet/MyApp.kt index fbb0705..a7c4e8c 100644 --- a/app/src/main/java/com/sw/platecabinet/MyApp.kt +++ b/app/src/main/java/com/sw/platecabinet/MyApp.kt @@ -5,6 +5,7 @@ import android.util.Log import com.sw.plate.App import com.sw.plate.utils.AppUtil import com.sw.platecabinet.utils.CrashHandler +import com.sw.platecabinet.utils.SpTool import timber.log.Timber class MyApp : App() { @@ -35,7 +36,16 @@ class MyApp : App() { Log.d("MyApp", "initialize: deviceId=$deviceId") GlobalData.deviceId = deviceId - GlobalData.appBaseUrl = if ("14d2dad5-7d33-3ced-8a59-f14cb1ef2d21" == deviceId) GlobalData.TEST_URL else GlobalData.PRO_URL + val url = SpTool.baseUrl + if (url.isNotBlank()) { + GlobalData.appBaseUrl = url + } else { + GlobalData.appBaseUrl = + if ("14d2dad5-7d33-3ced-8a59-f14cb1ef2d21" == deviceId) + GlobalData.TEST_BASE_URL + else + GlobalData.PROD_BASE_URL + } // TODO: 临时测试---------------- // if ("2987f0c5-5754-33e9-b00a-251db5e2e55f" == deviceId) { diff --git a/app/src/main/java/com/sw/platecabinet/dialog/BaseDialog.kt b/app/src/main/java/com/sw/platecabinet/dialog/BaseDialog.kt new file mode 100644 index 0000000..bcec634 --- /dev/null +++ b/app/src/main/java/com/sw/platecabinet/dialog/BaseDialog.kt @@ -0,0 +1,38 @@ +package com.sw.platecabinet.dialog + +import android.app.Dialog +import android.content.Context +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.Gravity +import android.view.View +import com.sw.platecabinet.R +import com.sw.platecabinet.ext.dp +import com.sw.platecabinet.ext.hideKeyboard + +abstract class BaseDialog( + context: Context, + var defWidth: Int = 400.dp, + var defHeight: Int = 300.dp +) : Dialog(context, R.style.MyDialog) { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val rootView = getRootView() + setContentView(rootView) + setCancelable(false) + setCanceledOnTouchOutside(false) + window?.apply { + setLayout(defWidth, defHeight) + setBackgroundDrawable(ColorDrawable()) + setGravity(Gravity.CENTER) + } + rootView.setOnClickListener { it.hideKeyboard() } + initView() + } + + abstract fun getRootView(): View + + abstract fun initView() + +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/platecabinet/dialog/EnvSwitchDialog.kt b/app/src/main/java/com/sw/platecabinet/dialog/EnvSwitchDialog.kt new file mode 100644 index 0000000..ed1ce91 --- /dev/null +++ b/app/src/main/java/com/sw/platecabinet/dialog/EnvSwitchDialog.kt @@ -0,0 +1,69 @@ +package com.sw.platecabinet.dialog + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import com.sw.plate.utils.ToastUtils +import com.sw.platecabinet.GlobalData +import com.sw.platecabinet.databinding.DialogEnvSwitchBinding +import com.sw.platecabinet.ext.dp +import com.sw.platecabinet.utils.SpTool + +/** + * 环境切换弹窗 + * + * 提供 TEST / UAT / PROD 三套环境的切换功能, + * 初始化时自动根据 [GlobalData.appBaseUrl] 选中当前环境, + * 确认后更新 [GlobalData.appBaseUrl] 并通过 [onEnvChanged] 回调通知外部。 + * + * @param context 上下文 + * @param onEnvChanged 确认切换后的回调,参数为新的 baseUrl + */ +class EnvSwitchDialog( + context: Context, + private val onEnvChanged: (newBaseUrl: String) -> Unit = {} +) : BaseDialog( + context, + defWidth = 600.dp, + defHeight = WindowManager.LayoutParams.WRAP_CONTENT +) { + + private lateinit var binding: DialogEnvSwitchBinding + + override fun getRootView(): View { + binding = DialogEnvSwitchBinding.inflate(LayoutInflater.from(context)) + return binding.root + } + + override fun initView() { + // 根据当前 appBaseUrl 预选对应 RadioButton,不匹配则不选 + when (GlobalData.appBaseUrl) { + GlobalData.TEST_BASE_URL -> binding.rbTest.isChecked = true + GlobalData.UAT_BASE_URL -> binding.rbUat.isChecked = true + GlobalData.PROD_BASE_URL -> binding.rbProd.isChecked = true + } + + // 取消按钮 + binding.btnCancel.setOnClickListener { dismiss() } + + // 确认按钮 + binding.btnConfirm.setOnClickListener { + // 未选中任何选项时提示用户 + if (binding.rgEnv.checkedRadioButtonId == -1) { + ToastUtils.showToast("请选择环境") + return@setOnClickListener + } + val newUrl = when (binding.rgEnv.checkedRadioButtonId) { + binding.rbTest.id -> GlobalData.TEST_BASE_URL + binding.rbUat.id -> GlobalData.UAT_BASE_URL + binding.rbProd.id -> GlobalData.PROD_BASE_URL + else -> return@setOnClickListener + } + GlobalData.appBaseUrl = newUrl + SpTool.baseUrl = newUrl + onEnvChanged(newUrl) + dismiss() + } + } +} diff --git a/app/src/main/java/com/sw/platecabinet/ext/CommonExt.kt b/app/src/main/java/com/sw/platecabinet/ext/CommonExt.kt index d449c3b..9715919 100644 --- a/app/src/main/java/com/sw/platecabinet/ext/CommonExt.kt +++ b/app/src/main/java/com/sw/platecabinet/ext/CommonExt.kt @@ -1,8 +1,10 @@ package com.sw.platecabinet.ext +import android.content.Context import android.content.res.Resources import android.util.TypedValue import android.view.View +import android.view.inputmethod.InputMethodManager import androidx.annotation.Dimension /** @@ -63,4 +65,12 @@ fun View.invisible() { fun View.gone() { visibility = View.GONE +} + +/** + * 隐藏软键盘 + */ +fun View.hideKeyboard() { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(windowToken, 0) } \ No newline at end of file diff --git a/app/src/main/java/com/sw/platecabinet/utils/SpTool.kt b/app/src/main/java/com/sw/platecabinet/utils/SpTool.kt index 272eca5..69e022f 100644 --- a/app/src/main/java/com/sw/platecabinet/utils/SpTool.kt +++ b/app/src/main/java/com/sw/platecabinet/utils/SpTool.kt @@ -2,6 +2,7 @@ package com.sw.platecabinet.utils import com.sw.inbound.utils.SPUtil import com.sw.inbound.utils.SPUtil.Companion.getInstance +import com.sw.platecabinet.GlobalKey import com.sw.platecabinet.MyApp object SpTool { @@ -45,4 +46,10 @@ object SpTool { spUtil?.boolean(IS_FIRST_GET_FACE, value) } + var baseUrl: String + get() = spUtil?.get(GlobalKey.KEY_BASE_URL, "") ?: "" + set(value) { + spUtil?.put(GlobalKey.KEY_BASE_URL, value) + } + } diff --git a/app/src/main/res/drawable/bg_cancel.xml b/app/src/main/res/drawable/bg_cancel.xml new file mode 100644 index 0000000..3a47108 --- /dev/null +++ b/app/src/main/res/drawable/bg_cancel.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_confirm.xml b/app/src/main/res/drawable/bg_confirm.xml new file mode 100644 index 0000000..f68dca1 --- /dev/null +++ b/app/src/main/res/drawable/bg_confirm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_white_radius12.xml b/app/src/main/res/drawable/bg_white_radius12.xml new file mode 100644 index 0000000..a622ffb --- /dev/null +++ b/app/src/main/res/drawable/bg_white_radius12.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_env_switch.xml b/app/src/main/res/layout/dialog_env_switch.xml new file mode 100644 index 0000000..ff242c0 --- /dev/null +++ b/app/src/main/res/layout/dialog_env_switch.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +