任务三 校验登录信息

一、任务目标

为关闭按钮和登录按钮添加点击处理。点击登录时依次检查用户名、密码和用户协议的勾选状态;未通过检查时显示对应提示,通过检查时显示临时的登录提示。

二、添加关闭与登录按钮点击事件

先给两个按钮添加点击处理:点击关闭按钮时结束登录页,点击登录按钮时显示一条临时提示,确认按钮可以使用。

1. 为两个按钮添加点击事件

打开 LoginActivity.kt,导入 Toast,并在 LoginActivity 中添加 initViews() 方法:

app/src/main/java/com/android/practice/food/feature/account/login/LoginActivity.kt
import android.widget.Toast
class LoginActivity : BaseActivity() {
// ... 省略成员变量和已经存在的 onCreate()。
private fun initViews() {
binding.closeBtn.setOnClickListener {
finish()
}
binding.loginBtn.setOnClickListener {
// 先用临时提示检查按钮点击,下一步再接入输入校验。
Toast.makeText(this, R.string.label_login_btn, Toast.LENGTH_SHORT).show()
}
}
}

finish() 会关闭登录页;Toast 会短暂显示“登录”。这条提示只用于检查按钮是否能点击,后面会换成输入校验。

2. 在 onCreate() 中调用 initViews()

在 onCreate() 方法中,完成 Data Binding 设置后调用 initViews():

app/src/main/java/com/android/practice/food/feature/account/login/LoginActivity.kt
class LoginActivity : BaseActivity() {
// ... 省略成员变量。
override fun onCreate(savedInstanceState: Bundle?) {
...
// 页面创建时,为关闭和登录按钮绑定点击事件。
initViews()
}
// ... 省略上一步已经完成的 initViews()。
}

这样,打开登录页时就会调用 initViews(),两个按钮才能响应点击。

3. 运行验证

运行应用并进入登录页。点击左上角的关闭按钮,确认登录页关闭;重新运行应用,点击“登录”按钮,确认页面下方短暂显示“登录”。

关闭按钮与登录按钮的点击效果

三、校验用户名

点击登录按钮后,先检查用户名。若未填写,就显示提示并结束本次点击处理。

1. 添加用户名非空校验

在 initViews() 方法后添加 handleLogin():

app/src/main/java/com/android/practice/food/feature/account/login/LoginActivity.kt
class LoginActivity : BaseActivity() {
// ... 省略已有成员和方法。
private fun handleLogin() {
val username = binding.etUsername.text?.toString().orEmpty()
if (username.isEmpty()) {
Toast.makeText(this, R.string.toast_lack_of_username, Toast.LENGTH_SHORT).show()
// 用户名未填写,本次登录不再继续检查。
return
}
}
}

binding.etUsername.text 取得输入框中的用户名;toString() 将它转成字符串,orEmpty() 在没有内容时得到空字符串。

如果用户名为空,就显示“用户名不能为空”。随后执行 return,不再检查密码和协议。

2. 登录按钮调用校验方法

回到 initViews(),将登录按钮原来的临时提示换成 handleLogin()。关闭按钮的代码保持原样。

app/src/main/java/com/android/practice/food/feature/account/login/LoginActivity.kt
class LoginActivity : BaseActivity() {
// ... 省略已有成员和 onCreate()。
private fun initViews() {
// ... 保留关闭按钮的点击事件。
binding.loginBtn.setOnClickListener {
Toast.makeText(this, R.string.label_login_btn, Toast.LENGTH_SHORT).show()
handleLogin()
}
}
// ... 保留已经完成的 handleLogin()。
}

3. 运行验证

用户名和密码都留空,也不勾选协议。点击“登录”后,应只看到“用户名不能为空”。

用户名为空时的运行效果

四、校验密码

用户名已填写时,再检查密码是否为空。

1. 添加密码非空校验

在 handleLogin() 中,紧接用户名校验的 if 代码块后添加密码校验:

app/src/main/java/com/android/practice/food/feature/account/login/LoginActivity.kt
class LoginActivity : BaseActivity() {
// ... 省略已有成员和方法。
private fun handleLogin() {
// ... 省略已经完成的用户名读取和空值校验。
val password = binding.etPassword.text?.toString().orEmpty()
if (password.isEmpty()) {
Toast.makeText(this, R.string.toast_lack_of_password, Toast.LENGTH_SHORT).show()
return
}
}
}

先检查用户名,再检查密码。两项都为空时,页面会先提示填写用户名。

2. 运行验证

填写用户名,密码留空,点击“登录”。页面应显示“密码不能为空”。

密码为空时的运行效果

五、校验协议勾选状态

用户名和密码都已填写时,再检查用户协议是否勾选。

1. 添加勾选状态判断

在 handleLogin() 中,紧接密码校验的 if 代码块后添加:

app/src/main/java/com/android/practice/food/feature/account/login/LoginActivity.kt
class LoginActivity : BaseActivity() {
// ... 省略已有成员和方法。
private fun handleLogin() {
// ... 省略已经完成的用户名校验和密码校验。
// 未勾选协议时,停止本次登录处理。
if (!binding.cbAgreement.isChecked) {
Toast.makeText(this, R.string.toast_lack_of_agreement, Toast.LENGTH_SHORT).show()
return
}
}
}

binding.cbAgreement.isChecked 表示协议是否已勾选;前面的 ! 表示“没有勾选”。因此,未勾选时会显示提示并结束本次处理。

2. 运行验证

填写用户名和密码,不勾选协议,点击“登录”。页面应显示“请阅读并同意用户隐私协议”。

用户协议未勾选时的运行效果

六、显示校验通过提示

三项检查都通过后,先显示“登录中…”,确认程序走到了这里。下一任务再接入登录请求。

1. 添加临时 Toast

在 handleLogin() 中,紧接协议校验的 if 代码块后添加临时提示:

app/src/main/java/com/android/practice/food/feature/account/login/LoginActivity.kt
class LoginActivity : BaseActivity() {
// ... 省略已有成员和方法。
private fun handleLogin() {
// ... 省略已经完成的用户名、密码和用户协议校验。
// 暂时提示校验通过,任务四会替换为真实登录请求。
Toast.makeText(
this,
R.string.message_logging,
Toast.LENGTH_SHORT
).show()
}
}

2. 运行验证

填写用户名和密码,勾选协议,点击“登录”。页面应显示“登录中…”。

全部校验通过时的运行效果

再分别尝试用户名为空、密码为空和未勾选协议,确认对应的提示仍能显示。

任务小结

本任务为关闭和登录按钮添加了点击处理。登录时,程序依次检查用户名、密码和协议勾选状态;未通过检查就显示提示并停止处理。