From 4e0525287189ead2b40d86cde62d96890db1389b Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期一, 31 三月 2025 09:02:03 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- app/src/main/java/com/example/firstapp/activity/VipActivity.kt | 387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 387 insertions(+), 0 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/activity/VipActivity.kt b/app/src/main/java/com/example/firstapp/activity/VipActivity.kt new file mode 100644 index 0000000..56df585 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/activity/VipActivity.kt @@ -0,0 +1,387 @@ +package com.example.firstapp.activity + +import android.app.AlertDialog +import android.graphics.Color +import android.os.Bundle +import android.util.TypedValue +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.Button +import android.widget.CheckBox +import android.widget.CompoundButton +import android.widget.EditText +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.cardview.widget.CardView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.lifecycle.lifecycleScope +import androidx.navigation.ui.AppBarConfiguration +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.firstapp.R +import com.example.firstapp.adapter.CardAdapter +import com.example.firstapp.database.service.RetrofitClient +import com.example.firstapp.databinding.ActivityVipBinding +import com.example.firstapp.model.CardData +import com.example.firstapp.model.MemberBenefitItem +import com.example.firstapp.pay.PayAbility +import com.example.firstapp.utils.Log +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlinx.coroutines.launch + + +class VipActivity : AppCompatActivity() { + + private lateinit var appBarConfiguration: AppBarConfiguration + private lateinit var binding: ActivityVipBinding + private var isPaymentSelected = false // 全局变量,默认未选中 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityVipBinding.inflate(layoutInflater) + setContentView(binding.root) + + setSupportActionBar(binding.toolbar) + + // 显式设置 MaterialToolbar 的标题 + supportActionBar?.title = "" + + // 如果不需要 ActionBar 的导航功能,可以禁用 +// supportActionBar?.setDisplayHomeAsUpEnabled(false) +// supportActionBar?.setDisplayShowHomeEnabled(false) + + + // 返回事件 + binding.ivBack.setOnClickListener{ + finish() + } + +// 会员卡片初始化 + vipCardInit() + +// 会员权益初始化 + memberBenefitInit() + + // 支付宝点击事件 + handleAlipayClick() + + // 微信点击事件 + handleWechatClick() + + // 勾选协议点击事件 + handlePrototalClick() + } + + + private fun handlePrototalClick(){ + val protocol: CheckBox = findViewById(R.id.protocol_checkbox); + + // 监听 RadioButton 选中状态 + protocol.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> + isPaymentSelected = isChecked // 更新全局变量 + if(isChecked){ + protocol.background = ContextCompat.getDrawable(this, R.drawable.checkbox_round_selected) + }else{ + protocol.background = ContextCompat.getDrawable(this, R.drawable.checkbox_round) + } + }) + } + + // 这里添加alipay_layout的点击事件 + private fun handleAlipayClick() { + // 绑定按钮 + val btnAlipay: LinearLayout = findViewById(R.id.alipay_layout); + btnAlipay.setOnClickListener(View.OnClickListener { + // 判断协议是否勾选 + if (!isPaymentSelected){ + // 这里需要弹出框 + showConfirmDialog() + }else{ + doAlipay() + } + + + }) + } + + private fun doAlipay(){ + lifecycleScope.launch { + try { + val response = RetrofitClient.apiService.getPayOrderInfo() + var orderInfo=response.data + Log.d("AliPayHelper","获取订单信息时: ${response}") + // 这里调用支付宝 + PayAbility.aliPay(this@VipActivity, orderInfo, Observer { + when (it.resultStatus) { + "9000" -> { +// Snackbar.make(binding.root, "支付成功", Snackbar.LENGTH_LONG).show() + runOnUiThread { + Toast.makeText(this@VipActivity, "支付成功", Toast.LENGTH_LONG).show() + } + } + else -> { +// Snackbar.make(binding.root, "支付失败", Snackbar.LENGTH_LONG).show() + + runOnUiThread { + Toast.makeText(this@VipActivity, "支付失败", Toast.LENGTH_LONG).show() + } + } + } + }) + + } catch (e: Exception) { + Toast.makeText(this@VipActivity, e.message, Toast.LENGTH_LONG).show() + Log.d("AliPayHelper","获取订单信息时发生错误: ${e.message}") + } + } + } + + private fun showConfirmDialog() { + val dialogView = LayoutInflater.from(this).inflate(R.layout.vip_protocol_dialog_custom, null) + + val dialog = AlertDialog.Builder(this) + .setView(dialogView) + .create() + + // 设置自定义背景 + dialog.window?.setBackgroundDrawableResource(R.drawable.dialog_background) + + // 获取按钮并设置点击事件 + val btnConfirm = dialogView.findViewById<Button>(R.id.btnConfirm) + btnConfirm.setOnClickListener { + // 将协议勾选上 + val protocol: CheckBox = findViewById(R.id.protocol_checkbox); + protocol.isChecked = true + + doAlipay() + dialog.dismiss() + } + + // 显示对话框 + dialog.show() + } + private fun showConfirmDialog2() { + // 创建标题 TextView 并居中 + val titleView = TextView(this).apply { + text = "确认开通" + textSize = 20f + gravity = Gravity.CENTER + setPadding(20, 20, 20, 20) + } + + // 创建内容 TextView 并居中 + val messageView = TextView(this).apply { + text = "请阅读并同意《会员协议》?" + textSize = 16f + gravity = Gravity.CENTER + setPadding(40, 20, 40, 20) + } + + AlertDialog.Builder(this) + .setCustomTitle(titleView) // 自定义标题 + .setView(messageView) // 自定义内容 + .setPositiveButton("继续开通") { _, _ -> + + + + // 确认支付 + doAlipay() + } + .setNegativeButton("取消") { dialog, _ -> + dialog.dismiss() // 关闭对话框 + } + .show() + } + + // 这里添加alipay_layout的点击事件 + private fun handleWechatClick() { + + // 绑定按钮 + val wechatAlipay: LinearLayout = findViewById(R.id.wechat_layout); + wechatAlipay.setOnClickListener(View.OnClickListener { + lifecycleScope.launch { + try { + // 判断协议是否勾选 + if (!isPaymentSelected){ + + Toast.makeText(this@VipActivity, "请勾选协议", Toast.LENGTH_LONG).show() + return@launch // 直接 return,不往下执行 + } + Toast.makeText(this@VipActivity, "功能暂未开放", Toast.LENGTH_LONG).show() + return@launch + + + } catch (e: Exception) { + Toast.makeText(this@VipActivity, e.message, Toast.LENGTH_LONG).show() + Log.d("AliPayHelper","获取订单信息时发生错误: ${e.message}") + } + } + }) + + + } + + + private fun vipCardInit() { + val recyclerView = findViewById<RecyclerView>(R.id.recycler_view) + recyclerView.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + + val cardList = listOf( + CardData.ContinueMonthly( + "首月限时特惠", + "连续包月", + "首次开通", + "9.9", + "次月起12元/月", + "自动续费可随时取消" + ), + CardData.Yearly( + "折合9元/月", + "年卡", + "108", + "168" + ), + CardData.SingleMonth( + "1个月", + "15" + ) + ) + + val adapter = CardAdapter(cardList) { cardViewList, cardData, cardView -> + handleVipCardClick(cardViewList, cardData, cardView) + } + + recyclerView.adapter = adapter + } + + private fun memberBenefitInit() { + val container = findViewById<ConstraintLayout>(R.id.dynamicContainer) + + // 传递过来的数据列表 + val itemList = listOf( + MemberBenefitItem(R.mipmap.vip_life_insurance, "自定义更多分类", true), + MemberBenefitItem(R.mipmap.vip_ad_no, "自动去广告", false), + MemberBenefitItem(R.mipmap.vip_ling, "公众号提醒待办", true), + MemberBenefitItem(R.mipmap.vip_circle_pie, "数据统计", false) + ) + + var previousViewId = R.id.dynamicContainer + + for ((index, item) in itemList.withIndex()) { + val iconView = ImageView(this).apply { + id = View.generateViewId() + setImageResource(item.iconRes) + layoutParams = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt(), + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt() + ) + } + + val textView = TextView(this).apply { + id = View.generateViewId() + text = item.text + textSize = 16f + setTextColor(Color.parseColor("#DFC08E")) + } + + val checkView = ImageView(this).apply { + id = View.generateViewId() + setImageResource(R.drawable.ic_check) + layoutParams = ConstraintLayout.LayoutParams( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt(), + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt() + ) + } + + container.addView(iconView) + container.addView(textView) + container.addView(checkView) + + val constraintSet = ConstraintSet() + constraintSet.clone(container) + + // Icon 位置 + constraintSet.connect( + iconView.id, + ConstraintSet.TOP, + previousViewId, + if (index == 0) ConstraintSet.TOP else ConstraintSet.BOTTOM, + 16 + ) + constraintSet.connect( + iconView.id, + ConstraintSet.START, + ConstraintSet.PARENT_ID, + ConstraintSet.START, + 16 + ) + + // Text 位置 + constraintSet.connect(textView.id, ConstraintSet.TOP, iconView.id, ConstraintSet.TOP) + constraintSet.connect( + textView.id, + ConstraintSet.START, + iconView.id, + ConstraintSet.END, + 8 + ) + + // Check 位置 + constraintSet.connect(checkView.id, ConstraintSet.TOP, iconView.id, ConstraintSet.TOP) + constraintSet.connect( + checkView.id, + ConstraintSet.END, + ConstraintSet.PARENT_ID, + ConstraintSet.END, + 16 + ) + + constraintSet.applyTo(container) + + previousViewId = iconView.id + } + } + + /** + * 会员卡样式点击事件 + */ + private fun handleVipCardClick(cardViewList: MutableList<CardView>, cardData: CardData, cardView: CardView) { + // 处理点击事件,修改样式 + // 修改所有的边框色都是灰色 + cardViewList.forEach { card -> + card.foreground = ContextCompat.getDrawable(this, R.drawable.gray_border_shape) // 设置自定义背景 + } + + // 单独将点击的卡片边框颜色改为金色 +// cardView.setCardBackgroundColor(Color.parseColor("#FF0000")) // 举例:设置背景颜色 + cardView.foreground = ContextCompat.getDrawable(this, R.drawable.gold_border_shape) // 设置自定义背景 + val title = when (cardData) { + is CardData.ContinueMonthly -> cardData.title + is CardData.Yearly -> cardData.title + is CardData.SingleMonth -> cardData.title + } + val price = when (cardData) { + is CardData.ContinueMonthly -> cardData.price + is CardData.Yearly -> cardData.price + is CardData.SingleMonth -> cardData.price + } + + + val alipayAmount:TextView = findViewById(R.id.alipay_amount); + val wechatAmount:TextView = findViewById(R.id.wechat_amount); + alipayAmount.text=price + wechatAmount.text=price + // 处理点击事件,这里我们只是简单地展示一个 Toast + Toast.makeText(this, "点击了: ${title}", Toast.LENGTH_SHORT).show() + } + +} \ No newline at end of file -- Gitblit v1.9.3