如果电子邮件和密码不为空,则使用 Rxjava 更改按钮的可见性
Change Visibility of a button if Email & password is not empty using Rxjava
当电子邮件和密码 TextInputEditText 用于登录功能时,我想验证登录屏幕中的表单。我使用具有相应逻辑的 ObservableEmailText 和 ObservablePasswordText。为此,我使用扩展函数
Extensions.kt
fun TextInputEditText.checkError(textInputLayout: TextInputLayout, errorMessage: String, isValid: (String)->Boolean): Observable<String> {
return textChanges()
.map { it.toString() }
.doOnNext {
if (it.isNotEmpty()) {
textInputLayout.error = if (isValid(it)) null else errorMessage
}
}
}
MainActivity.kt
private val emailObservable
get() = email_edit_text.checkError(email_input_layout, "Invalid Email") {
viewModel.isEmailValid(it)
}
private val phoneNumberObservable
get() = password_edit_text.checkError(password_input_layout, "Invalid Password") {
viewModel.isPasswordValid(it)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutResource())
compositeDisposable += Observable.combineLatest<String, String, Boolean>(
emailObservable,
phoneNumberObservable,
BiFunction { t1, t2 -> viewModel.isEmailValid(t1) && viewModel.isPasswordValid(t2) }
).subscribe({
if (it) login_button.visibility = View.VISIBLE
}, {})
}
我遇到的问题是,第一次没有完成Email和password的逻辑,按钮一直隐藏。但是当我完成电子邮件和密码的逻辑时,它就变得可见了。没事。其实我也想要那个。但问题是当我清除文本或做一些不符合从 TextViews 获取价值的逻辑的文本时,它仍然可见。我该如何解决这个问题
那是因为一旦您使按钮可见,View.VISIBLE
逻辑一完成。但是如果之后有变化,你就再也不会隐藏它了。
所以基本上你在你的订阅部分缺少一个 else 块
compositeDisposable += Observable.combineLatest<String, String, Boolean>(
emailObservable,
phoneNumberObservable,
BiFunction { t1, t2 -> viewModel.isEmailValid(t1) && viewModel.isPasswordValid(t2) }
).subscribe({
if (it) login_button.visibility = View.VISIBLE
else login_button.visibility = View.GONE // This line is missing
}, {})
当电子邮件和密码 TextInputEditText 用于登录功能时,我想验证登录屏幕中的表单。我使用具有相应逻辑的 ObservableEmailText 和 ObservablePasswordText。为此,我使用扩展函数
Extensions.kt
fun TextInputEditText.checkError(textInputLayout: TextInputLayout, errorMessage: String, isValid: (String)->Boolean): Observable<String> {
return textChanges()
.map { it.toString() }
.doOnNext {
if (it.isNotEmpty()) {
textInputLayout.error = if (isValid(it)) null else errorMessage
}
}
}
MainActivity.kt
private val emailObservable
get() = email_edit_text.checkError(email_input_layout, "Invalid Email") {
viewModel.isEmailValid(it)
}
private val phoneNumberObservable
get() = password_edit_text.checkError(password_input_layout, "Invalid Password") {
viewModel.isPasswordValid(it)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutResource())
compositeDisposable += Observable.combineLatest<String, String, Boolean>(
emailObservable,
phoneNumberObservable,
BiFunction { t1, t2 -> viewModel.isEmailValid(t1) && viewModel.isPasswordValid(t2) }
).subscribe({
if (it) login_button.visibility = View.VISIBLE
}, {})
}
我遇到的问题是,第一次没有完成Email和password的逻辑,按钮一直隐藏。但是当我完成电子邮件和密码的逻辑时,它就变得可见了。没事。其实我也想要那个。但问题是当我清除文本或做一些不符合从 TextViews 获取价值的逻辑的文本时,它仍然可见。我该如何解决这个问题
那是因为一旦您使按钮可见,View.VISIBLE
逻辑一完成。但是如果之后有变化,你就再也不会隐藏它了。
所以基本上你在你的订阅部分缺少一个 else 块
compositeDisposable += Observable.combineLatest<String, String, Boolean>(
emailObservable,
phoneNumberObservable,
BiFunction { t1, t2 -> viewModel.isEmailValid(t1) && viewModel.isPasswordValid(t2) }
).subscribe({
if (it) login_button.visibility = View.VISIBLE
else login_button.visibility = View.GONE // This line is missing
}, {})