186 lines
7.1 KiB
Kotlin
186 lines
7.1 KiB
Kotlin
package com.example.defenseapplication.login
|
|
import android.content.Intent
|
|
import android.graphics.Color
|
|
import android.graphics.drawable.GradientDrawable
|
|
import com.example.defenseapplication.R
|
|
import android.os.Bundle
|
|
import android.os.CountDownTimer
|
|
import android.view.View
|
|
import android.widget.Toast
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import androidx.constraintlayout.widget.ConstraintLayout
|
|
import androidx.constraintlayout.widget.ConstraintSet
|
|
import com.example.defenseapplication.databinding.ActivityLoginBinding
|
|
import com.gyf.immersionbar.ImmersionBar
|
|
//登录
|
|
class LoginActivity : AppCompatActivity() {
|
|
|
|
private lateinit var binding: ActivityLoginBinding
|
|
private var currentLoginMode = LoginMode.SMS
|
|
|
|
enum class LoginMode { SMS, PASSWORD }
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
binding = ActivityLoginBinding.inflate(layoutInflater)
|
|
setContentView(binding.root)
|
|
|
|
// 设置渐变背景
|
|
val startColor = Color.parseColor("#CBEBFA")
|
|
val endColor = Color.parseColor("#FFF2EF")
|
|
setGradientBackground(binding.main, startColor, endColor)
|
|
|
|
ImmersionBar.with(this)
|
|
.statusBarDarkFont(true)
|
|
.titleBar(binding.logoFrame)
|
|
.init()
|
|
|
|
setupTabListeners()
|
|
setupClickListeners()
|
|
switchToSmsMode()
|
|
}
|
|
|
|
private fun setupTabListeners() {
|
|
binding.tvSmsLogin.setOnClickListener {
|
|
if (currentLoginMode != LoginMode.SMS) {
|
|
currentLoginMode = LoginMode.SMS
|
|
switchToSmsMode()
|
|
}
|
|
}
|
|
binding.tvPwdLogin.setOnClickListener {
|
|
if (currentLoginMode != LoginMode.PASSWORD) {
|
|
currentLoginMode = LoginMode.PASSWORD
|
|
switchToPasswordMode()
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun switchToSmsMode() {
|
|
binding.tvSmsLogin.setTextColor(getColor(R.color.black))
|
|
binding.tvPwdLogin.setTextColor(getColor(R.color.gray))
|
|
|
|
binding.smsRowLayout.visibility = View.VISIBLE
|
|
binding.passwordRowLayout.visibility = View.GONE // 隐藏密码行容器
|
|
|
|
binding.registerText.visibility = View.VISIBLE
|
|
binding.forgetText.visibility = View.GONE
|
|
updateRegisterTextConstraints(center = true)
|
|
|
|
//需要正确的方法名和参数
|
|
updateLoginButtonTopConstraint(R.id.smsRowLayout)
|
|
}
|
|
|
|
private fun switchToPasswordMode() {
|
|
binding.tvPwdLogin.setTextColor(getColor(R.color.black))
|
|
binding.tvSmsLogin.setTextColor(getColor(R.color.gray))
|
|
|
|
binding.smsRowLayout.visibility = View.GONE
|
|
//正确的属性访问
|
|
binding.passwordRowLayout.visibility = View.VISIBLE // 显示密码行容器
|
|
|
|
binding.registerText.visibility = View.VISIBLE
|
|
binding.forgetText.visibility = View.VISIBLE
|
|
updateRegisterTextConstraints(center = false)
|
|
|
|
updateLoginButtonTopConstraint(R.id.passwordRowLayout)
|
|
}
|
|
|
|
// 动态修改登录按钮的顶部约束
|
|
private fun updateLoginButtonTopConstraint(topTargetId: Int) {
|
|
val params = binding.loginBtn.layoutParams as ConstraintLayout.LayoutParams
|
|
params.topToBottom = topTargetId
|
|
params.topMargin = 32
|
|
binding.loginBtn.layoutParams = params
|
|
}
|
|
|
|
// 动态修改立即注册的约束(居中/左对齐)
|
|
private fun updateRegisterTextConstraints(center: Boolean) {
|
|
val params = binding.registerText.layoutParams as ConstraintLayout.LayoutParams
|
|
if (center) {
|
|
// 短信模式:居中显示
|
|
params.startToStart = ConstraintSet.PARENT_ID
|
|
params.endToEnd = ConstraintSet.PARENT_ID
|
|
} else {
|
|
// 密码模式:左对齐登录按钮
|
|
params.startToStart = binding.loginBtn.id
|
|
params.endToEnd = ConstraintSet.UNSET
|
|
}
|
|
params.topToBottom = binding.loginBtn.id
|
|
params.topMargin = 20
|
|
binding.registerText.layoutParams = params
|
|
}
|
|
|
|
private fun setupClickListeners() {
|
|
binding.loginBtn.setOnClickListener {
|
|
val phone = binding.etPhone.text.toString()
|
|
if (phone.isEmpty()) {
|
|
Toast.makeText(this, R.string.enter_phone_number, Toast.LENGTH_SHORT).show()
|
|
return@setOnClickListener
|
|
}
|
|
when (currentLoginMode) {
|
|
LoginMode.SMS -> {
|
|
val code = binding.etSmsCode.text.toString()
|
|
if (code.isEmpty()) {
|
|
Toast.makeText(this, R.string.enter_verification_code_pls, Toast.LENGTH_SHORT).show()
|
|
} else {
|
|
Toast.makeText(this, getString(R.string.sms_login_success, phone, code), Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
LoginMode.PASSWORD -> {
|
|
val pwd = binding.etPassword.text.toString()
|
|
if (pwd.isEmpty()) {
|
|
Toast.makeText(this, R.string.password_hint, Toast.LENGTH_SHORT).show()
|
|
} else {
|
|
Toast.makeText(this, getString(R.string.password_login_success, phone, pwd), Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
binding.sendCodeBtn.setOnClickListener {
|
|
val phone = binding.etPhone.text.toString()
|
|
if (phone.isEmpty()) {
|
|
Toast.makeText(this, R.string.phone_hint, Toast.LENGTH_SHORT).show()
|
|
return@setOnClickListener
|
|
}
|
|
Toast.makeText(this, getString(R.string.code_sent_to, phone), Toast.LENGTH_SHORT).show()
|
|
startCountDown()
|
|
}
|
|
|
|
binding.registerText.setOnClickListener {
|
|
val intent= Intent(this, RegisterActivity::class.java)
|
|
startActivity(intent)
|
|
Toast.makeText(this, R.string.redirect_register_page, Toast.LENGTH_SHORT).show()
|
|
}
|
|
|
|
binding.forgetText.setOnClickListener {
|
|
val intent= Intent(this, ForgetPasswordActivity::class.java)
|
|
startActivity(intent)
|
|
Toast.makeText(this, R.string.forgot_password_page, Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
|
|
private fun startCountDown() {
|
|
binding.sendCodeBtn.isEnabled = false
|
|
object : CountDownTimer(60000, 1000) {
|
|
override fun onTick(millisUntilFinished: Long) {
|
|
binding.sendCodeBtn.text = getString(R.string.countdown_retry, millisUntilFinished / 1000)
|
|
}
|
|
override fun onFinish() {
|
|
binding.sendCodeBtn.text = getString(R.string.send_code)
|
|
binding.sendCodeBtn.isEnabled = true
|
|
}
|
|
}.start()
|
|
}
|
|
|
|
private fun setGradientBackground(
|
|
view: android.view.View,
|
|
startColor: Int,
|
|
endColor: Int,
|
|
orientation: GradientDrawable.Orientation = GradientDrawable.Orientation.TL_BR
|
|
) {
|
|
val gradientDrawable = GradientDrawable(orientation, intArrayOf(startColor, endColor))
|
|
gradientDrawable.gradientType = GradientDrawable.LINEAR_GRADIENT
|
|
view.background = gradientDrawable
|
|
}
|
|
} |