| | |
| | | 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.entity.CardData |
| | | 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) |
| | |
| | | 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) |
| | | recyclerView.layoutManager = |
| | | LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) |
| | | |
| | | val cardList = listOf( |
| | | CardData.ContinueMonthly( |
| | | "首月限时特惠", |
| | | "连续包月", |
| | | "首次开通", |
| | | "¥9.9", |
| | | "9.9", |
| | | "次月起12元/月", |
| | | "自动续费可随时取消" |
| | | ), |
| | | CardData.Yearly( |
| | | "折合9元/月", |
| | | "年卡", |
| | | "¥108/年", |
| | | "¥168" |
| | | "108", |
| | | "168" |
| | | ), |
| | | CardData.SingleMonth( |
| | | "1个月", |
| | | "¥15" |
| | | "15" |
| | | ) |
| | | ) |
| | | |
| | | val adapter = CardAdapter(cardList) {cardViewList, cardData, cardView -> |
| | | handleCardClick(cardViewList,cardData,cardView) |
| | | val adapter = CardAdapter(cardList) { cardViewList, cardData, cardView -> |
| | | handleVipCardClick(cardViewList, cardData, cardView) |
| | | } |
| | | |
| | | recyclerView.adapter = adapter |
| | | } |
| | | |
| | | private fun memberBenefitInit() { |
| | | val container = findViewById<ConstraintLayout>(R.id.dynamicContainer) |
| | | |
| | | try { |
| | | val firstMonthCardView = findViewById<CardView>(R.id.vip_first_month_card_view) |
| | | firstMonthCardView.foreground = ContextCompat.getDrawable(this, R.drawable.gray_border_shape) // 设置自定义背景 |
| | | // 传递过来的数据列表 |
| | | 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) |
| | | ) |
| | | |
| | | }catch (e: Exception){ |
| | | e.stackTrace |
| | | Log.e("VipActivity",e.message+"") |
| | | 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 handleCardClick(cardViewList: MutableList<CardView>,cardData: CardData, cardView: CardView) { |
| | | private fun handleVipCardClick(cardViewList: MutableList<CardView>, cardData: CardData, cardView: CardView) { |
| | | // 处理点击事件,修改样式 |
| | | // 修改所有的边框色都是灰色 |
| | | cardViewList.forEach { card -> |
| | |
| | | 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() |
| | | } |