我有标准的登录表单,其中包含2个编辑文本(一个用于电子邮件,另一个用于密码)和一个用于登录的按钮。
我想在用户点击登录按钮时向服务器发送电子邮件和密码。
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data class="ActivityMainBinding">
<variable
name="login"
type="com.example.itstym.reminder.loginViewModel" />
<variable
name="handler"
type="com.example.itstym.reminder.LoginHandler" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.itstym.reminder.MainActivity">
<EditText
app:error="@{login.errorEmail}"
android:text="@{login.userEmailAddress}"
android:hint="Email Address"
android:id="@+id/email_address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="24dp"/>
<EditText
app:error="@{login.errorPassword}"
android:text="@{login.userPassword}"
android:hint="Password"
android:id="@+id/user_password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="0dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/email_address"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@+id/email_address"/>
<Button
android:onClick="@{() -> handler.onLoginButtonClicked(login)}"
android:id="@+id/submit_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:text="Sign In"
app:layout_constraintEnd_toEndOf="@+id/user_password"
app:layout_constraintStart_toStartOf="@+id/user_password"
app:layout_constraintTop_toBottomOf="@+id/user_password"/>
</android.support.constraint.ConstraintLayout>
</layout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding=DataBindingUtil.setContentView<com.example.itstym.reminder.databinding.ActivityMainBinding>(this@MainActivity,R.layout.activity_main)
Log.i("Binding class ",binding.javaClass.simpleName.toString())
Log.i("type ",binding.javaClass.toString())
val login:loginViewModel=loginViewModel()
binding.login=login
val handler= LoginHandler()
binding.handler=handler
}
}
loginViewModel.kt
class loginViewModel(): BaseObservable() {
@Bindable
var userEmailAddress:String= String()
set(userEmailAddress){
field=userEmailAddress
notifyPropertyChanged(R.id.email_address)
/*to check Email for validation on every character inserted by user*/
notifyPropertyChanged(BR.errorEmail)
}
get() {
return field
}
@Bindable
var userPassword:String = String()
set(userPassword){
field=userPassword
notifyPropertyChanged(R.id.user_password)
notifyPropertyChanged(BR.errorPassword)
}
get() {
return field
}
}
//删除了一些用于可读目的的代码
LoginHandler.kt
class LoginHandler() {
fun onLoginButtonClicked(userInfo: loginViewModel){
Log.i("Button Clicked ","yup")
Log.i("Email is ",userInfo.userEmailAddress)
Log.i("Password is ",userInfo.userPassword)
}
}
问题:我无法在onLoginButtonClicked()中写入电子邮件地址和密码。为什么??
任何领导都会有所帮助。
在低估问题之前,添加有助于改进问题的评论。
答案 0 :(得分:1)
在 activity_main.xml 文件中,您只使用单向数据绑定。如果您想使用双向数据绑定,则必须使用符号后面的等号( @ = ),例如:< / p>
单向数据绑定(仅在属性更改时更新视图)
机器人:文本=&#34;的 @ 强> {login.userEmailAddress}&#34;
机器人:文本=&#34;的 @ 强> {login.userPassword}&#34;
双向数据绑定(属性更改时更新视图,反之亦然)
机器人:文本=&#34; @的 = 强> {login.userEmailAddress}&#34;
机器人:文本=&#34; @的 = 强> {login.userPassword}&#34;
Kevin Pelgrim有a great talk about Data Binding,如果你想深入了解这个话题。
额外资源:
Episode 057: Data Binding with GDE Lisa Wray - Fragmented Podcast
Episode 35: Data Bound - Android Developer Backstage
希望它有所帮助!