baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -356,33 +356,8 @@ } try { // 连接NFC - 确保总是建立连接,增加重试机制 int retryCount = 3; boolean connected = false; while (retryCount > 0 && !connected) { try { if (!mfc.isConnected()) { mfc.connect(); } connected = mfc.isConnected(); if (!connected) { Thread.sleep(100); // 短暂等待后重试 retryCount--; } } catch (Exception e) { retryCount--; if (retryCount <= 0) { throw e; } Thread.sleep(100); } } if (!connected) { if (callBack != null) { callBack.isSusses(false, "NFC连接失败,请重新靠近卡片"); } return false; if (isConnect) { mfc.connect(); } for (int i = 0; i < passWord.size(); i++) { generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt
@@ -389,6 +389,7 @@ putExtra("orderNumber", cancelResult.orderNo) putExtra("refundAmount", refundAmount) putExtra("userCard", userCard) putExtra("cardInfo", cardInfo) // 传递当前卡内余额信息 cardInfo?.let { info -> putExtra("cardBalance", info.balance ?: 0.0) generallibrary/src/main/java/com/dayu/general/activity/CardDeductActivity.kt
@@ -384,6 +384,7 @@ putExtra("orderNumber", deductResult.orderNo) putExtra("deductAmount", deductAmount) putExtra("userCard", updatedUserCard as java.io.Serializable) putExtra("cardInfo", cardInfo) } startActivity(intent) finish() generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
@@ -376,6 +376,7 @@ putExtra("paymentMethod", paymentMethod) // 传递支付方式 putExtra("paymentId", paymentId) // 传递支付方式ID putExtra("userCard", updatedUserCard as java.io.Serializable) putExtra("cardInfo", cardInfo) } startActivity(intent) finish() generallibrary/src/main/java/com/dayu/general/activity/CardReturnActivity.kt
@@ -385,6 +385,7 @@ putExtra("orderNumber", returnResult.orderNo) putExtra("returnAmount", returnAmount) putExtra("userCard", updatedUserCard as java.io.Serializable) putExtra("cardInfo", cardInfo) } startActivity(intent) finish() generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
@@ -6,6 +6,7 @@ import com.dayu.baselibrary.utils.MornyUtil import com.dayu.general.BaseApplication import com.dayu.general.bean.card.UserCard import com.dayu.general.bean.net.CardInfoResult import com.dayu.general.databinding.ActivityCardWriteSuccessBinding import com.dayu.general.tool.CardOperationType @@ -22,11 +23,12 @@ private var operationTypeCode: Int = -1 private var userCard: UserCard? = null private var orderNumber: String? = null private var cardInfo: CardInfoResult? = null // 充值相关参数 private var rechargeAmount = 0.0 private var bonusAmount = 0.0 // 其他操作相关参数 private var refundAmount = 0.0 private var cardBalance = 0.0 @@ -34,6 +36,7 @@ private var deductAmount = 0.0 private var cardCost = 0.0 private var reissueAmount = 0.0 private var cardFee = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -45,11 +48,13 @@ cardAddr = intent.getStringExtra("cardAddr") operationTypeCode = intent.getIntExtra("operationTypeCode", -1) orderNumber = intent.getStringExtra("orderNumber") cardFee = intent.getIntExtra("cardFee", 0); // 获取充值相关参数 rechargeAmount = intent.getDoubleExtra("rechargeAmount", 0.0) bonusAmount = intent.getDoubleExtra("bonusAmount", 0.0) // 获取其他操作相关参数 refundAmount = intent.getDoubleExtra("refundAmount", 0.0) cardBalance = intent.getDoubleExtra("cardBalance", 0.0) @@ -57,9 +62,13 @@ deductAmount = intent.getDoubleExtra("deductAmount", 0.0) cardCost = intent.getDoubleExtra("cardCost", 0.0) reissueAmount = intent.getDoubleExtra("reissueAmount", 0.0) if (intent.hasExtra("userCard")) { userCard = intent.getSerializableExtra("userCard") as UserCard } if (intent.hasExtra("cardInfo")) { cardInfo = intent.getSerializableExtra("cardInfo") as CardInfoResult } initView() @@ -84,7 +93,7 @@ "卡片已成功销卡并清除内容\n卡号:$cardNumber\n该卡片将无法再次使用" } binding.successMessage.text = message // 销卡成功后自动打印 userCard?.let { card -> doPrint(card) @@ -105,7 +114,7 @@ "卡片返还操作已成功完成\n卡号:$cardNumber\n卡内余额已更新" } binding.successMessage.text = message // 返还成功后自动打印 userCard?.let { card -> doPrint(card) @@ -126,7 +135,7 @@ "卡片补扣操作已成功完成\n卡号:$cardNumber\n卡内余额已更新" } binding.successMessage.text = message // 补扣成功后自动打印 userCard?.let { card -> doPrint(card) @@ -152,22 +161,36 @@ CardOperationType.Recharge -> { binding.titleBar.setCenterText("充值成功") binding.successTitle.text = "充值成功" val messageBuilder = StringBuilder() messageBuilder.append("充值操作已成功完成\n") if (rechargeAmount > 0) { messageBuilder.append("充值金额:${String.format("%.2f", rechargeAmount)}元\n") } if (bonusAmount > 0) { messageBuilder.append("赠送金额:${String.format("%.2f", bonusAmount)}元\n") } messageBuilder.append("卡内余额:${MornyUtil.changeF2Y(userCard?.balance ?: 0)}元") binding.successMessage.text = messageBuilder.toString() // 充值成功后自动打印 userCard?.let { card -> doPrint(card) } } CardOperationType.OpenCard -> { binding.titleBar.setCenterText("开卡成功") binding.successTitle.text = "开卡成功" val messageBuilder = StringBuilder() if (rechargeAmount > 0) { messageBuilder.append("充值金额:${String.format("%.2f", rechargeAmount)}元\n") } messageBuilder.append("卡内余额:${MornyUtil.changeF2Y(userCard?.balance ?: 0)}元") // 充值成功后自动打印 userCard?.let { card -> doPrint(card) @@ -193,6 +216,13 @@ finish() } // 设置再次打印按钮点击监听器 binding.btnReprint.setOnClickListener { userCard?.let { card -> doPrint(card) } } // 设置标题栏返回按钮 binding.titleBar.setOnItemclickListner(com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE) { finish() @@ -208,206 +238,341 @@ try { // 创建打印数据列表 val data: MutableList<String> = ArrayList() // 根据操作类型设置不同的打印内容 val operationType = CardOperationType.fromCode(operationTypeCode) when (operationType) { CardOperationType.Recharge -> { // 充值打印内容 data.add("*****************************") data.add(" 充值凭证") data.add(" 充值凭证") data.add("*****************************") // 添加用户编号(从UserCard中获取) if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.userCode}") // 添加用户名(从CardInfo中获取) cardInfo?.userName?.let { userName -> if (userName.isNotEmpty()) { data.add("用户姓名:$userName") } } // 添加卡地址 val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } // 添加用户编号(从UserCard中获取) if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } // 添加充值金额 if (rechargeAmount > 0) { data.add("充值金额:${String.format("%.2f", rechargeAmount)} 元") } // 添加赠送金额 if (bonusAmount > 0) { data.add("赠送金额:${String.format("%.2f", bonusAmount)} 元") } // 添加充值后余额 data.add("充值后余额:${MornyUtil.changeF2Y(userCard.balance)} 元") // 添加日期信息 data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") // 添加订单号 if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } // 添加设备操作员信息 data.add("设备操作员:${BaseApplication.userName}") // 添加日期信息 data.add( "日 期:${ DateUtil.dateToStamp( System.currentTimeMillis(), DateUtil.type2 ) }" ) data.add("*****************************") } CardOperationType.ReplaceCard -> { // 补卡打印内容 data.add("*****************************") data.add(" 补卡凭证") data.add("*****************************") // 添加用户名(从CardInfo中获取) cardInfo?.userName?.let { userName -> if (userName.isNotEmpty()) { data.add("用户姓名:$userName") } } val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (cardCost > 0) { data.add("工 本 费:${String.format("%.2f", cardCost)} 元") } if (reissueAmount > 0) { data.add("返还金额:${String.format("%.2f", reissueAmount)} 元") } data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add( "日 期:${ DateUtil.dateToStamp( System.currentTimeMillis(), DateUtil.type2 ) }" ) data.add("*****************************") } CardOperationType.CancelCard -> { // 销卡打印内容 data.add("*****************************") data.add(" 销卡凭证") data.add("*****************************") // 添加用户名(从CardInfo中获取) cardInfo?.userName?.let { userName -> if (userName.isNotEmpty()) { data.add("用户姓名:$userName") } } val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (refundAmount > 0) { data.add("退款金额:${String.format("%.2f", refundAmount)} 元") } data.add("原卡余额:${String.format("%.2f", cardBalance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add( "日 期:${ DateUtil.dateToStamp( System.currentTimeMillis(), DateUtil.type2 ) }" ) data.add("*****************************") } CardOperationType.SUPPLEMENT -> { CardOperationType.SUPPLEMENT -> { // 返还打印内容 data.add("*****************************") data.add(" 返还凭证") data.add("*****************************") // 添加用户名(从CardInfo中获取) cardInfo?.userName?.let { userName -> if (userName.isNotEmpty()) { data.add("用户姓名:$userName") } } val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (returnAmount > 0) { data.add("返还金额:${String.format("%.2f", returnAmount)} 元") } data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add( "日 期:${ DateUtil.dateToStamp( System.currentTimeMillis(), DateUtil.type2 ) }" ) data.add("*****************************") } CardOperationType.DeductCard -> { // 补扣打印内容 data.add("*****************************") data.add(" 补扣凭证") data.add("*****************************") // 添加用户名(从CardInfo中获取) cardInfo?.userName?.let { userName -> if (userName.isNotEmpty()) { data.add("用户姓名:$userName") } } val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (deductAmount > 0) { data.add("补扣金额:${String.format("%.2f", deductAmount)} 元") } data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add( "日 期:${ DateUtil.dateToStamp( System.currentTimeMillis(), DateUtil.type2 ) }" ) data.add("*****************************") } CardOperationType.OpenCard -> { data.add("*****************************") data.add(" 开卡凭证") data.add("*****************************") // 添加用户名(从CardInfo中获取) cardInfo?.userName?.let { userName -> if (userName.isNotEmpty()) { data.add("用户姓名:$userName") } } // 添加卡地址 val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } // 添加用户编号(从UserCard中获取) if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } // 添加充值金额 if (rechargeAmount > 0) { data.add("充值金额:${String.format("%.2f", rechargeAmount)} 元") // 添加充值后余额 data.add("充值后余额:${MornyUtil.changeF2Y(userCard.balance)} 元") } // 添加赠送金额 if (cardFee > 0) { data.add("工本费:" + MornyUtil.changeF2Y(cardFee) + "元") } // 添加订单号 if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } // 添加设备操作员信息 data.add("设备操作员:${BaseApplication.userName}") // 添加日期信息 data.add( "日 期:${ DateUtil.dateToStamp( System.currentTimeMillis(), DateUtil.type2 ) }" ) data.add("*****************************") } else -> { // 其他操作的通用打印内容 data.add("*****************************") data.add(" 操作凭证") data.add("*****************************") // 添加用户名(从CardInfo中获取) cardInfo?.userName?.let { userName -> if (userName.isNotEmpty()) { data.add("用户姓名:$userName") } } val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } data.add("操作类型:${operationType?.description ?: "未知操作"}") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") data.add("设备操作员:${BaseApplication.userName}") data.add( "日 期:${ DateUtil.dateToStamp( System.currentTimeMillis(), DateUtil.type2 ) }" ) data.add("*****************************") } } // 设置打印字体大小 val size = 26f // 执行打印操作 PrintAdater.printText(data, size, true, false) } catch (e: Exception) { // 打印异常信息 e.printStackTrace() generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt
@@ -206,7 +206,7 @@ // 异步修改密码 nfcHelper.changePSAsync( keyList, true, // 修改为true,确保建立NFC连接 false, // 修改为true,确保建立NFC连接 true ) { success: Boolean, msg: String? -> if (success) { @@ -228,12 +228,6 @@ ).show() } } } // 创建密钥列表的副本,避免ConcurrentModificationException // 处理NFC读取结果 NfcReadHelper.getInstance(intent, this).getCardNumber().let { cardNumber -> } } generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -470,6 +470,7 @@ putExtra("userCard", userCard) putExtra("operationTypeCode", CardOperationType.OpenCard.code) putExtra("cardFee", cardFee) startActivityForResult(this, REQUEST_CODE_NFC_WRITE) } } catch (e: Exception) { generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -13,6 +13,7 @@ import com.dayu.general.bean.card.ClearCard import com.dayu.general.bean.card.DebugCard import com.dayu.general.bean.card.UserCard import com.dayu.general.bean.net.CardInfoResult import com.dayu.general.dao.BaseDaoSingleton import com.dayu.general.databinding.ActivityNfcWriteGeBinding import com.dayu.general.net.ApiManager @@ -98,6 +99,8 @@ /** 项目号(1-255) */ private var projectNumber: String = "" private var cardInfo: CardInfoResult? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityNfcWriteGeBinding.inflate(layoutInflater) @@ -116,6 +119,7 @@ operationTypeCode = intent?.getIntExtra("operationTypeCode", -1) ?: -1 orderNumber = intent?.getStringExtra("orderNumber") ?: "" operationType = CardOperationType.fromCode(operationTypeCode) cardInfo = intent?.getSerializableExtra("cardInfo") as? CardInfoResult // 获取充值相关金额 rechargeAmount = intent?.getDoubleExtra("rechargeAmount", 0.0) ?: 0.0 @@ -501,14 +505,14 @@ object : NFCCallBack { override fun isSusses(flag: Boolean, msg: String?) { // 确保Toast在主线程中调用 runOnUiThread { if (flag) { // 检查卡写卡成功,更新写卡状态 updateCardWrittenStatus(cardAddr) } else { ToastUtil.show("检查卡写卡失败: ${msg ?: "未知错误"}") runOnUiThread { if (flag) { // 检查卡写卡成功,更新写卡状态 updateCardWrittenStatus(cardAddr) } else { ToastUtil.show("检查卡写卡失败: ${msg ?: "未知错误"}") } } } } }) } @@ -525,14 +529,14 @@ object : NFCCallBack { override fun isSusses(flag: Boolean, msg: String?) { // 确保Toast在主线程中调用 runOnUiThread { if (flag) { // 区域表号卡写卡成功,更新写卡状态 updateCardWrittenStatus(cardAddr) } else { ToastUtil.show("区域表号卡写卡失败: ${msg ?: "未知错误"}") runOnUiThread { if (flag) { // 区域表号卡写卡成功,更新写卡状态 updateCardWrittenStatus(cardAddr) } else { ToastUtil.show("区域表号卡写卡失败: ${msg ?: "未知错误"}") } } } } }) } @@ -548,14 +552,14 @@ object : NFCCallBack { override fun isSusses(flag: Boolean, msg: String?) { // 确保Toast在主线程中调用 runOnUiThread { if (flag) { // 调试卡写卡成功,更新写卡状态 updateCardWrittenStatus(cardAddr) } else { ToastUtil.show("调试卡写卡失败: ${msg ?: "未知错误"}") runOnUiThread { if (flag) { // 调试卡写卡成功,更新写卡状态 updateCardWrittenStatus(cardAddr) } else { ToastUtil.show("调试卡写卡失败: ${msg ?: "未知错误"}") } } } } }) } @@ -605,17 +609,17 @@ lifecycleScope.launch { try { val baseDaoSingleton = BaseDaoSingleton.getInstance(this@NfcWreatActivity) // 根据操作类型判断是管理卡还是用户卡操作 val isManagerCardOperation = operationTypeCode in 100..108 var updateSuccess = false if (isManagerCardOperation) { // 管理卡制作操作类型,查询和更新ManagerCardBean val managerCardDao = baseDaoSingleton.managerCardDao() val managerCard = managerCardDao.getByOrderId(orderNumber) if (managerCard != null) { val updatedManagerCard = managerCard.copy(isCardWritten = true) managerCardDao.update(updatedManagerCard) @@ -625,7 +629,7 @@ // 用户卡操作类型,查询和更新CardRegistrationBean val cardRegistrationDao = baseDaoSingleton.cardRegistrationDao() val cardRegistration = cardRegistrationDao.getByOrderId(orderNumber) if (cardRegistration != null) { val updatedCardRegistration = cardRegistration.copy(isCardWritten = true) cardRegistrationDao.update(updatedCardRegistration) @@ -637,21 +641,54 @@ runOnUiThread { setResult(RESULT_OK) finish() // 跳转到写卡成功界面 Intent(this@NfcWreatActivity, CardWriteSuccessActivity::class.java).apply { putExtra("cardNumber", cardNumber) putExtra("cardAddr", cardAddr) putExtra("operationTypeCode", operationTypeCode) putExtra("orderNumber", orderNumber) //开卡相关参数 putExtra("cardFee", cardFee) // 传递充值相关参数 putExtra("rechargeAmount", rechargeAmount) putExtra("bonusAmount", bonusAmount) // 传递销卡相关参数 putExtra("refundAmount", refundAmount) putExtra("cardBalance", cardBalance) // 传递返还相关参数 putExtra("returnAmount", returnAmount) // 传递补扣相关参数 putExtra("deductAmount", deductAmount) // 传递补卡相关参数 putExtra("cardCost", cardCost) putExtra("reissueAmount", reissueAmount) // 传递用户卡对象 if (::userCard.isInitialized) { putExtra("userCard", userCard) } putExtra("operationTypeCode", operationTypeCode) // 传递卡片信息对象 cardInfo?.let { putExtra("cardInfo", it) } startActivity(this) } // 通知MainActivity调用postCardData notifyMainActivityToPostCardData(cardNumber) } } catch (e: Exception) { // 记录异常信息 CrashReport.postCatchedException(e) generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -555,6 +555,8 @@ putExtra("userCard", cardToWrite) putExtra("rechargeAmount", rechargeAmount) // 传递充值金额 putExtra("bonusAmount", bonusAmount) // 传递赠送金额 putExtra("cardInfo", cardInfo) putExtra(EXTRA_CARD_INFO, cardInfo) } startActivity(intent) finish() generallibrary/src/main/res/drawable/bg_button_outline.xml
New file @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@android:color/transparent" /> <stroke android:width="1.5dp" android:color="#2196F3" /> <corners android:radius="8dp" /> </shape> generallibrary/src/main/res/drawable/bg_button_outline_selector.xml
New file @@ -0,0 +1,21 @@ <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="#E3F2FD" /> <stroke android:width="1.5dp" android:color="#2196F3" /> <corners android:radius="8dp" /> </shape> </item> <item> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> <stroke android:width="1.5dp" android:color="#2196F3" /> <corners android:radius="8dp" /> </shape> </item> </selector> generallibrary/src/main/res/layout/activity_card_write_success.xml
@@ -22,67 +22,93 @@ android:layout_marginStart="16dp" android:layout_marginTop="24dp" android:layout_marginEnd="16dp" android:layout_marginBottom="80dp" android:layout_marginBottom="24dp" app:cardBackgroundColor="@android:color/white" app:cardCornerRadius="12dp" app:cardElevation="4dp" app:layout_constraintBottom_toTopOf="@id/btnConfirm" app:layout_constraintBottom_toTopOf="@id/buttonContainer" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/titleBar"> <LinearLayout <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="32dp"> android:fillViewport="true"> <ImageView android:id="@+id/successIcon" android:layout_width="150dp" android:layout_height="150dp" android:scaleType="fitCenter" android:src="@drawable/icon_success" /> <TextView android:id="@+id/successTitle" android:layout_width="wrap_content" <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:text="写卡成功" android:textColor="#4CAF50" android:textSize="24sp" android:textStyle="bold" /> <TextView android:id="@+id/successMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center" android:text="卡片信息已成功写入\n请妥善保管您的卡片" android:textColor="#666666" android:textSize="16sp" android:lineSpacingExtra="4dp" /> android:orientation="vertical" android:padding="24dp" android:minHeight="300dp"> </LinearLayout> <ImageView android:id="@+id/successIcon" android:layout_width="120dp" android:layout_height="120dp" android:scaleType="fitCenter" android:src="@drawable/icon_success" /> <TextView android:id="@+id/successTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="写卡成功" android:textColor="#4CAF50" android:textSize="22sp" android:textStyle="bold" /> <TextView android:id="@+id/successMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:gravity="center" android:text="卡片信息已成功写入\n请妥善保管您的卡片" android:textColor="#666666" android:textSize="15sp" android:lineSpacingExtra="4dp" /> </LinearLayout> </ScrollView> </androidx.cardview.widget.CardView> <Button android:id="@+id/btnConfirm" <LinearLayout android:id="@+id/buttonContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="32dp" android:layout_marginEnd="32dp" android:layout_marginBottom="24dp" android:background="@drawable/bg_button_primary" android:text="确定" android:textColor="@android:color/white" android:textSize="18sp" android:textStyle="bold" android:orientation="vertical" android:paddingStart="32dp" android:paddingEnd="32dp" android:paddingBottom="24dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent"> <Button android:id="@+id/btnReprint" android:layout_width="match_parent" android:layout_height="44dp" android:layout_marginBottom="12dp" android:background="@drawable/bg_button_outline_selector" android:text="再次打印" android:textColor="#2196F3" android:textSize="16sp" android:textStyle="bold" /> <Button android:id="@+id/btnConfirm" android:layout_width="match_parent" android:layout_height="48dp" android:background="@drawable/bg_button_primary" android:text="确定" android:textColor="@android:color/white" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>