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