【问题标题】:show data onClick data binding in Android在Android中显示数据onClick数据绑定
【发布时间】:2017-07-05 08:28:40
【问题描述】:

我有标准的登录表单,它有 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() 中打印电子邮件地址和密码。为什么??

任何线索都会有所帮助。

在否决问题之前,添加有助于改进问题的评论。

【问题讨论】:

  • 你的问题是什么?
  • 嘿,对不起,我忘记了。我现在已经编辑了这个问题。 @earthw0rmjim

标签: android data-binding android-databinding 2-way-object-databinding


【解决方案1】:

在您的 activity_main.xml 文件中,您仅使用 单向数据绑定。如果要使用双向数据绑定,则必须使用at 符号后的等号 (@=) 例如:

单向数据绑定(仅在属性更改时更新视图)

android:text="@{login.userEmailAddress}"
android:text="@{login.userPassword}"

双向数据绑定(属性变化时更新视图,反之亦然)

android:text="@={login.userEmailAddress}"
android:text="@={login.userPassword}"

如果您想深入了解该主题,请访问 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

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2018-04-13
    相关资源
    最近更新 更多