切换家庭,我的修改名称,手机号

This commit is contained in:
2026-05-11 17:50:35 +08:00
parent a8def9d719
commit e8de34b136
32 changed files with 721 additions and 84 deletions

View File

@@ -60,12 +60,14 @@ class CustomDialogFragmentText : DialogFragment() {
return this
}
fun setOnConfirmListener(listener: (String) -> Unit) {
fun setOnConfirmListener(listener: (String) -> Unit): CustomDialogFragmentText {
this.onConfirmListener = listener
return this
}
fun setOnDismissListener(listener: () -> Unit) {
fun setOnDismissListener(listener: () -> Unit): CustomDialogFragmentText {
this.onDismissListener = listener
return this
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

View File

@@ -0,0 +1,69 @@
package com.example.defenseapplication.view
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.Gravity
import android.view.Window
import android.view.WindowManager
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.FamilySwitchAdapter
import com.example.defenseapplication.model.FamilyItem
/**
* 家庭切换对话框
*/
class FamilySwitchDialog(
context: Context,
private val onFamilySelected: (String) -> Unit
) : Dialog(context, R.style.BottomDialogStyle) {
private lateinit var adapter: FamilySwitchAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_family_switch)
val window = window
val params = window?.attributes
params?.width = WindowManager.LayoutParams.MATCH_PARENT
params?.height = WindowManager.LayoutParams.WRAP_CONTENT
params?.gravity = Gravity.BOTTOM
window?.attributes = params
window?.setBackgroundDrawableResource(android.R.color.transparent)
window?.setDimAmount(0.5f)
initViews()
}
private fun initViews() {
val tvCancel = findViewById<TextView>(R.id.tvCancel)
val tvConfirm = findViewById<TextView>(R.id.tvConfirm)
val rvMessageList = findViewById<RecyclerView>(R.id.rvMessageList)
val familyList = listOf(
FamilyItem("1", context.getString(R.string.my_family)),
FamilyItem("2", context.getString(R.string.zhangsan_family))
)
adapter = FamilySwitchAdapter(familyList) { familyItem ->
}
rvMessageList.layoutManager = LinearLayoutManager(context)
rvMessageList.adapter = adapter
tvCancel.setOnClickListener {
dismiss()
}
tvConfirm.setOnClickListener {
val selectedFamily = adapter.getSelectedItem()
onFamilySelected(selectedFamily.name)
dismiss()
}
}
}

View File

@@ -0,0 +1,134 @@
package com.example.defenseapplication.view
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import android.os.CountDownTimer
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.DialogFragment
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.DialogPhoneModifyBinding
//手机号弹窗
class PhoneModifyDialogFragment : DialogFragment() {
private lateinit var binding: DialogPhoneModifyBinding
private var title: String = ""
private var negativeText: String = ""
private var positiveText: String = ""
private var onConfirmListener: ((String, String) -> Unit)? = null
private var onDismissListener: (() -> Unit)? = null
private var countDownTimer: CountDownTimer? = null
fun setTitle(title: String): PhoneModifyDialogFragment {
this.title = title
return this
}
fun setNegativeText(text: String): PhoneModifyDialogFragment {
this.negativeText = text
return this
}
fun setPositiveText(text: String): PhoneModifyDialogFragment {
this.positiveText = text
return this
}
fun setOnConfirmListener(listener: (phone: String, code: String) -> Unit): PhoneModifyDialogFragment {
this.onConfirmListener = listener
return this
}
fun setOnDismissListener(listener: () -> Unit): PhoneModifyDialogFragment {
this.onDismissListener = listener
return this
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
dialog.window?.let {
val params = it.attributes
params.gravity = Gravity.CENTER
params.width = WindowManager.LayoutParams.MATCH_PARENT
params.height = WindowManager.LayoutParams.WRAP_CONTENT
it.attributes = params
it.setBackgroundDrawableResource(R.drawable.round_bg)
}
return dialog
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = DialogPhoneModifyBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (negativeText.isEmpty()) negativeText = getString(R.string.cancel)
if (positiveText.isEmpty()) positiveText = getString(R.string.confirm)
binding.tvTitle.text = title
binding.btnNegative.text = negativeText
binding.btnPositive.text = positiveText
binding.tvSendCode.setOnClickListener {
val phone = binding.etPhone.text.toString()
if (phone.length != 11) {
ToastUtils.showToast(requireContext(), getString(R.string.invalid_phone))
return@setOnClickListener
}
startCountDown()
}
binding.btnNegative.setOnClickListener {
dismiss()
}
binding.btnPositive.setOnClickListener {
val phone = binding.etPhone.text.toString()
val code = binding.etCode.text.toString()
if (phone.length != 11) {
ToastUtils.showToast(requireContext(), getString(R.string.invalid_phone))
return@setOnClickListener
}
if (code.isEmpty()) {
ToastUtils.showToast(requireContext(), getString(R.string.enter_verification_code))
return@setOnClickListener
}
onConfirmListener?.invoke(phone, code)
dismiss()
}
}
private fun startCountDown() {
binding.tvSendCode.isEnabled = false
countDownTimer = object : CountDownTimer(60000, 1000) {
override fun onTick(millisUntilFinished: Long) {
binding.tvSendCode.text = String.format("%ds", millisUntilFinished / 1000)
}
override fun onFinish() {
binding.tvSendCode.text = getString(R.string.send_sms_code)
binding.tvSendCode.isEnabled = true
}
}
countDownTimer?.start()
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
countDownTimer?.cancel()
onDismissListener?.invoke()
onConfirmListener = null
onDismissListener = null
}
}

View File

@@ -10,6 +10,14 @@ object ToastUtils {
private var currentToast: Toast? = null
fun showToast(context: Context, message: String, duration: Int = Toast.LENGTH_SHORT) {
currentToast?.cancel()
val toast = Toast.makeText(context.applicationContext, message, duration)
toast.setGravity(Gravity.CENTER, 0, 0)
currentToast = toast
toast.show()
}
/**
* 显示成功提示
* @param message 提示文字