From 2fece6551faab0402e7ed53658a60d2256e7a5be Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期四, 12 六月 2025 14:58:56 +0800
Subject: [PATCH] feat(generallibrary): 新增挂失功能并优化相关界面- 新增 LossCardActivity 和 CardWriteSuccessActivity - 实现卡片挂失功能和写卡成功页面 - 优化充值界面布局- 调整卡片信息显示逻辑 - 修复部分 UI样式问题

---
 README.md |  374 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 372 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index f276ded..10c21e2 100644
--- a/README.md
+++ b/README.md
@@ -317,8 +317,17 @@
 2. 鐐瑰嚮浜嬩欢鐩戝惉
 ```kotlin
 // 鏂瑰紡1锛氫娇鐢ㄧ被鍨嬪父閲忥紙鎺ㄨ崘锛�
-titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) { finish() }
-titleBar.setOnItemclickListner(TitleBar.ClickType_RIGHT_TEXT) { showMenu() }
+titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) { 
+    finish() 
+}
+titleBar.setOnItemclickListner(TitleBar.ClickType_RIGHT_TEXT) { 
+    showMenu() 
+}
+
+// 鎴栬�呬娇鐢ㄥ畬鏁寸殑OnClickListener
+titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE, View.OnClickListener {
+    finish()
+})
 
 // 鏂瑰紡2锛氫娇鐢ㄤ綅缃拰绫诲瀷甯搁噺锛堝凡搴熷純锛�
 titleBar.setOnItemclickListner(TitleBar.IMAGE, TitleBar.LEFT) { finish() }
@@ -352,6 +361,173 @@
 2. 璁剧疆鏂囨湰鎴栧浘鐗囨椂锛屽鏋滀紶鍏ull鎴�0锛屽搴旂殑瑙嗗浘灏嗚闅愯棌
 3. 缁勪欢榛樿浣跨敤鍨傜洿绾挎�у竷灞�锛岀‘淇濆湪甯冨眬鏂囦欢涓缃悎閫傜殑楂樺害
 
+#### 甯歌浣跨敤绀轰緥
+```kotlin
+// 鍦ˋctivity鐨刬nitView鏂规硶涓缃�
+private fun initView() {
+    // 璁剧疆杩斿洖鎸夐挳鐐瑰嚮浜嬩欢
+    binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
+        finish()
+    }
+    
+    // 璁剧疆鍙充晶鏂囨湰鎸夐挳鐐瑰嚮浜嬩欢
+    binding.titleBar.setOnItemclickListner(TitleBar.ClickType_RIGHT_TEXT) {
+        // 澶勭悊鍙充晶鎸夐挳鐐瑰嚮閫昏緫
+        handleRightButtonClick()
+    }
+}
+```
+
+## 鏀粯鏂瑰紡鍔ㄦ�佽幏鍙栧姛鑳�
+
+椤圭洰涓疄鐜颁簡鏀粯鏂瑰紡鐨勫姩鎬佽幏鍙栧拰鏄剧ず鍔熻兘锛屾敮鎸佷粠鏈嶅姟鍣ㄨ幏鍙栨敮浠樻柟寮忓垪琛ㄥ苟鍔ㄦ�佸垱寤篟adioButton銆�
+
+### 鏁版嵁缁撴瀯
+
+```kotlin
+// 鏀粯鏂瑰紡鏁版嵁绫�
+data class PaymentMethod(
+    val id: Long,
+    val name: String,
+    val remarks: String,
+    val deleted: Int
+)
+
+// 鏀粯鏂瑰紡鎺ュ彛杩斿洖鏁版嵁绫�
+data class PaymentMethodResponse(
+    val itemTotal: Any?,
+    val obj: List<PaymentMethod>,
+    val pageCurr: Any?,
+    val pageSize: Any?,
+    val pageTotal: Any?
+)
+```
+
+### 浣跨敤鏂瑰紡
+
+#### 1. 鍦ˋctivity涓坊鍔犳敮浠樻柟寮忕浉鍏冲睘鎬�
+
+```kotlin
+class YourActivity : AppCompatActivity() {
+    // 鏀粯鏂瑰紡鐩稿叧灞炴��
+    private var paymentMethod: String = "鐜伴噾"
+    private var paymentId: Long = 0
+    private var paymentMethodList: List<PaymentMethod> = listOf()
+    
+    // ... 鍏朵粬浠g爜
+}
+```
+
+#### 2. 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+
+```kotlin
+/**
+ * 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+ */
+private fun getPaymentMethods() {
+    ApiManager.getInstance().requestGetLoading(
+        this,
+        "sell/paymentmethod/get",
+        PaymentMethodResponse::class.java,
+        null,
+        object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
+            override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
+                if (response.success) {
+                    val paymentMethods = response.content?.obj ?: listOf()
+                    if (paymentMethods.isNotEmpty()) {
+                        paymentMethodList = paymentMethods
+                        updatePaymentMethodRadioGroup()
+                    }
+                } else {
+                    Toast.makeText(this@YourActivity, "鑾峰彇鏀粯鏂瑰紡澶辫触: ${response.msg}", Toast.LENGTH_SHORT).show()
+                }
+            }
+
+            override fun onError(e: Throwable?) {
+                super.onError(e)
+                Toast.makeText(this@YourActivity, "鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}", Toast.LENGTH_SHORT).show()
+            }
+        }
+    )
+}
+```
+
+#### 3. 鍔ㄦ�佸垱寤篟adioButton
+
+```kotlin
+/**
+ * 鏇存柊鏀粯鏂瑰紡RadioGroup
+ */
+private fun updatePaymentMethodRadioGroup() {
+    // 娓呯┖鍘熸湁RadioButton
+    binding.paymentMethodRadioGroup.removeAllViews()
+
+    // 鍔ㄦ�佹坊鍔燫adioButton
+    paymentMethodList.forEachIndexed { index, method ->
+        val radioButton = RadioButton(this)
+        radioButton.id = View.generateViewId()
+        radioButton.layoutParams = LinearLayout.LayoutParams(0, resources.getDimensionPixelSize(R.dimen.dimen_40), 1.0f)
+
+        // 璁剧疆鏍峰紡
+        radioButton.text = method.name
+        radioButton.background = resources.getDrawable(R.drawable.radio_selector)
+        radioButton.buttonDrawable = null
+        radioButton.gravity = Gravity.CENTER
+        radioButton.setTextColor(resources.getColorStateList(R.color.radio_button_text_color))
+        radioButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
+
+        // 娣诲姞鍒癛adioGroup
+        binding.paymentMethodRadioGroup.addView(radioButton)
+
+        // 榛樿閫変腑绗竴涓�
+        if (index == 0) {
+            radioButton.isChecked = true
+            paymentMethod = method.name
+            paymentId = method.id
+        }
+    }
+
+    // 璁剧疆閫夋嫨鐩戝惉
+    binding.paymentMethodRadioGroup.setOnCheckedChangeListener { group, checkedId ->
+        for (i in 0 until group.childCount) {
+            val radioButton = group.getChildAt(i) as RadioButton
+            if (radioButton.id == checkedId) {
+                paymentMethod = radioButton.text.toString()
+                paymentId = paymentMethodList[i].id
+                break
+            }
+        }
+    }
+}
+```
+
+#### 4. 甯冨眬鏂囦欢閰嶇疆
+
+```xml
+<RadioGroup
+    android:id="@+id/paymentMethodRadioGroup"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
+    <!-- 鍔ㄦ�佹坊鍔燫adioButton锛屼笉闇�瑕侀瀹氫箟 -->
+</RadioGroup>
+```
+
+### 鍔熻兘鐗圭偣
+
+1. **鍔ㄦ�佽幏鍙�**: 浠庢湇鍔″櫒鍔ㄦ�佽幏鍙栨敮浠樻柟寮忓垪琛紝鏀寔鍚庡彴閰嶇疆
+2. **鑷姩甯冨眬**: 鏍规嵁鏀粯鏂瑰紡鏁伴噺鑷姩璋冩暣RadioButton甯冨眬
+3. **鏍峰紡缁熶竴**: 鎵�鏈夊姩鎬佸垱寤虹殑RadioButton浣跨敤缁熶竴鐨勬牱寮�
+4. **榛樿閫夋嫨**: 鑷姩閫変腑绗竴涓敮浠樻柟寮忎綔涓洪粯璁ら�夐」
+5. **浜嬩欢澶勭悊**: 鏀寔閫夋嫨鍙樺寲鐩戝惉锛屽疄鏃舵洿鏂板綋鍓嶉�変腑鐨勬敮浠樻柟寮�
+
+### 娉ㄦ剰浜嬮」
+
+1. 纭繚鍦ㄨ皟鐢╜getPaymentMethods()`鍓嶅凡缁忓垵濮嬪寲浜嗙浉鍏崇殑UI缁勪欢
+2. 鍔ㄦ�佸垱寤虹殑RadioButton闇�瑕佽缃敮涓�鐨処D锛屼娇鐢╜View.generateViewId()`
+3. 鍦ˋctivity閿�姣佹椂娉ㄦ剰娓呯悊鐩稿叧璧勬簮锛岄伩鍏嶅唴瀛樻硠婕�
+4. 缃戠粶璇锋眰澶辫触鏃惰鏈夌浉搴旂殑閿欒澶勭悊鏈哄埗
+
 ## 娉ㄦ剰浜嬮」
 
 1. 鏁版嵁搴撹縼绉�
@@ -371,6 +547,200 @@
    - 纭繚寮傚父淇℃伅琚纭褰曞拰涓婃姤
    - 閬垮厤寮傚父淇℃伅娉勯湶鏁忔劅鏁版嵁
 
+5. API寮傚父澶勭悊鏈�浣冲疄璺�
+   - 閽堝鐗瑰畾閿欒鐮佹彁渚涘弸濂界殑鐢ㄦ埛鎻愮ず
+   - 鍖哄垎缃戠粶寮傚父銆佷笟鍔″紓甯稿拰绯荤粺寮傚父
+   - 寮傚父鍙戠敓鍚庡強鏃堕噸缃甎I鐘舵�侊紝鍏佽鐢ㄦ埛閲嶈瘯
+   - 鎻愪緵鏄庣‘鐨勬搷浣滄寚寮曪紝濡�"璇峰厛杩涜寮�鍗℃搷浣�"
+
+### API寮傚父澶勭悊绀轰緥
+
+```kotlin
+// 鍦ˋPI鍥炶皟涓鐞嗕笉鍚岀被鍨嬬殑寮傚父
+object : SubscriberListener<BaseResponse<YourDataType>>() {
+    override fun onNext(response: BaseResponse<YourDataType>) {
+        if (response.success) {
+            // 澶勭悊鎴愬姛鎯呭喌
+            handleSuccess(response.content)
+        } else {
+            // 澶勭悊涓氬姟寮傚父
+            handleBusinessError(response.code, response.msg)
+        }
+    }
+
+    override fun onError(e: Throwable?) {
+        super.onError(e)
+        // 澶勭悊缃戠粶寮傚父
+        handleNetworkError(e)
+        // 閲嶇疆UI鐘舵��
+        resetViewState()
+    }
+}
+
+// 涓氬姟寮傚父澶勭悊鏂规硶
+private fun handleBusinessError(code: String?, msg: String?) {
+    when (code) {
+        "1081" -> ToastUtil.show("璇ュ崱鐗囨湭鍦ㄧ郴缁熶腑娉ㄥ唽锛岃鍏堣繘琛屽紑鍗℃搷浣�")
+        "1001" -> ToastUtil.show("鏉冮檺涓嶈冻锛岃鑱旂郴绠$悊鍛�")
+        "1002" -> ToastUtil.show("璐︽埛浣欓涓嶈冻")
+        else -> {
+            val errorMsg = when {
+                msg.isNullOrBlank() -> "鎿嶄綔澶辫触锛岃閲嶈瘯"
+                msg.contains("鏁版嵁涓嶅瓨鍦�") -> "鏁版嵁涓嶅瓨鍦紝璇锋鏌ヨ緭鍏ヤ俊鎭�"
+                msg.contains("缃戠粶") -> "缃戠粶杩炴帴寮傚父锛岃妫�鏌ョ綉缁滃悗閲嶈瘯"
+                msg.contains("瓒呮椂") -> "璇锋眰瓒呮椂锛岃閲嶈瘯"
+                else -> "鎿嶄綔澶辫触: $msg"
+            }
+            ToastUtil.show(errorMsg)
+        }
+    }
+    // 閲嶇疆鐣岄潰鐘舵��
+    resetViewState()
+}
+
+// 缃戠粶寮傚父澶勭悊鏂规硶
+private fun handleNetworkError(e: Throwable?) {
+    val errorMsg = when {
+        e?.message?.contains("timeout") == true -> "缃戠粶璇锋眰瓒呮椂锛岃妫�鏌ョ綉缁滆繛鎺�"
+        e?.message?.contains("network") == true -> "缃戠粶杩炴帴澶辫触锛岃妫�鏌ョ綉缁滆缃�"
+        e?.message?.contains("host") == true -> "鏈嶅姟鍣ㄨ繛鎺ュけ璐ワ紝璇风◢鍚庨噸璇�"
+        else -> "缃戠粶寮傚父: ${e?.message ?: "鏈煡閿欒"}"
+    }
+    ToastUtil.show(errorMsg)
+}
+
+### Dialog寮圭獥浣跨敤鏈�浣冲疄璺�
+
+椤圭洰涓彁渚涗簡澶氱Dialog缁勪欢锛岀敤浜庝笉鍚岀殑浜や簰鍦烘櫙銆傛帹鑽愪娇鐢ㄩ」鐩凡鏈夌殑Dialog缁勪欢鏉ヤ繚鎸乁I椋庢牸鐨勪竴鑷存�с��
+
+#### 甯哥敤Dialog缁勪欢
+
+1. **ConfirmDialog**: 纭瀵硅瘽妗嗭紝鐢ㄤ簬閲嶈鎿嶄綔鐨勪簩娆$‘璁�
+2. **TipDialog**: 鎻愮ず瀵硅瘽妗嗭紝鐢ㄤ簬鏄剧ず鎻愮ず淇℃伅
+3. **EdtDialog**: 杈撳叆瀵硅瘽妗嗭紝鐢ㄤ簬鑾峰彇鐢ㄦ埛杈撳叆
+4. **鑷畾涔塂ialog**: 缁ф壙Dialog绫诲疄鐜扮壒瀹氬姛鑳�
+
+#### ConfirmDialog浣跨敤绀轰緥
+
+```kotlin
+// 鍩烘湰鐢ㄦ硶 - 鍙樉绀烘秷鎭�
+val dialog = ConfirmDialog(context, "鎿嶄綔鎴愬姛")
+dialog.show()
+
+// 甯︽爣棰樼殑鐢ㄦ硶
+val dialog = ConfirmDialog(context, "鎻愮ず", "纭瑕佸垹闄よ繖鏉¤褰曞悧锛�") {
+    // 鐐瑰嚮纭鎸夐挳鐨勫洖璋�
+    deleteRecord()
+    dialog.dismiss()
+}
+dialog.show()
+
+// 鍦ㄥ紓甯稿鐞嗕腑浣跨敤
+private fun handleError(title: String, message: String) {
+    activity?.let { activity ->
+        val confirmDialog = ConfirmDialog(activity, title, message) {
+            // 鐐瑰嚮纭鍚庣殑鎿嶄綔
+            resetViewState()
+        }
+        confirmDialog.show()
+    }
+}
+```
+
+#### TipDialog浣跨敤绀轰緥
+
+```kotlin
+// 绠�鍗曟彁绀�
+val tipDialog = TipDialog(context, "鎿嶄綔瀹屾垚")
+tipDialog.show()
+
+// 甯﹀洖璋冪殑鎻愮ず
+val tipDialog = TipDialog(context, "纭閫�鍑哄簲鐢紵", object : TipUtil.TipListener {
+    override fun onCancle() {
+        // 鍙栨秷鎿嶄綔
+    }
+})
+tipDialog.show()
+```
+
+#### 鑷畾涔塂ialog鏈�浣冲疄璺�
+
+```kotlin
+class CustomDialog(context: Context) : Dialog(context, R.style.ws_pay_showSelfDialog) {
+    
+    private lateinit var binding: DialogCustomBinding
+    
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = DialogCustomBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+        
+        // 璁剧疆瀵硅瘽妗嗗睘鎬�
+        setupDialog()
+        
+        // 鍒濆鍖栬鍥�
+        initViews()
+    }
+    
+    private fun setupDialog() {
+        // 璁剧疆瀵硅瘽妗嗗搴︿负灞忓箷瀹藉害鐨�85%
+        window?.apply {
+            val params = attributes
+            params.width = (context.resources.displayMetrics.widthPixels * 0.85).toInt()
+            params.height = ViewGroup.LayoutParams.WRAP_CONTENT
+            params.gravity = Gravity.CENTER
+            attributes = params
+            setBackgroundDrawableResource(android.R.color.transparent)
+        }
+        
+        // 璁剧疆鐐瑰嚮澶栭儴涓嶅彇娑�
+        setCanceledOnTouchOutside(false)
+    }
+    
+    private fun initViews() {
+        binding.btnConfirm.setOnClickListener {
+            // 澶勭悊纭閫昏緫
+            dismiss()
+        }
+        
+        binding.btnCancel.setOnClickListener {
+            dismiss()
+        }
+    }
+}
+```
+
+#### Dialog浣跨敤娉ㄦ剰浜嬮」
+
+1. **鍐呭瓨娉勬紡闃叉姢**: 纭繚鍦ˋctivity閿�姣佹椂鍏抽棴Dialog
+```kotlin
+override fun onDestroy() {
+    super.onDestroy()
+    dialog?.dismiss()
+}
+```
+
+2. **鐢熷懡鍛ㄦ湡绠$悊**: 鍦‵ragment涓娇鐢―ialog鏃舵敞鎰忕敓鍛藉懆鏈�
+```kotlin
+// 鍦‵ragment涓畨鍏ㄦ樉绀篋ialog
+activity?.let { activity ->
+    if (!activity.isFinishing && !activity.isDestroyed) {
+        dialog.show()
+    }
+}
+```
+
+3. **鏍峰紡涓�鑷存��**: 浣跨敤椤圭洰缁熶竴鐨凞ialog鏍峰紡
+```kotlin
+// 浣跨敤椤圭洰瀹氫箟鐨凞ialog鏍峰紡
+super(context, R.style.ws_pay_showSelfDialog)
+```
+
+4. **鐢ㄦ埛浣撻獙浼樺寲**: 
+   - 閲嶈鎿嶄綔浣跨敤ConfirmDialog杩涜浜屾纭
+   - 閿欒淇℃伅浣跨敤甯︽爣棰樼殑Dialog锛屾彁渚涙竻鏅扮殑閿欒鍒嗙被
+   - 闀挎椂闂存搷浣滄樉绀哄姞杞紻ialog锛岄伩鍏嶇敤鎴疯鎿嶄綔
+
 ## 璐$尞鎸囧崡
 
 1. Fork 椤圭洰

--
Gitblit v1.8.0