【问题标题】:How to bind data to the viewModel using MVVM architecture in Android如何在 Android 中使用 MVVM 架构将数据绑定到 viewModel
【发布时间】:2017-11-28 06:38:27
【问题描述】:
    val binding= DataBindingUtil.setContentView<ActivityMainBinding>(this@MainActivity,R.layout.activity_main)

视图模型

    var viewModel:LoginViewModel = LoginViewModel("Enter Email Address","Enter password","Log-in")

但是当我这样做时

    binding.Login=viewModel

它指向登录并显示未解析的引用。

activity_main.xml

<data>

    <variable
        name="Login"
        type="com.example.itstym.logina.LoginViewModel" />

    <variable
        name="clickListener"
        type="com.example.itstym.logina.interface.loginClickListener" />

</data>


<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:textStyle="bold"
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Welcome, Back"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="24dp"/>

    <EditText
        app:error="@{login.errorEmail}"
        android:hint="@{login.emailHint}"
        android:text="@{login.userEmailAddress}"
        android:id="@+id/user_email_address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:ems="10"
        android:inputType="textEmailAddress"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginTop="24dp"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        android:layout_marginStart="8dp"/>

    <EditText
        app:error="@{login.errorPassword}"
        android:text="@{login.userPassword}"
        android:hint="@{login.passwordHint}"
        android:id="@+id/user_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:ems="10"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/user_email_address"/>

    <Button
        android:onClick="@{(v)->clickListener.onSubmitButtonClick()}"
        android:text="@{login.loginButtonText}"
        android:id="@+id/login_submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        app:layout_constraintTop_toBottomOf="@+id/user_password"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"/>

    <TextView
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Or Sign In"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginTop="24dp"
        app:layout_constraintTop_toBottomOf="@+id/login_submit"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="log in with google plus"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginTop="16dp"
        app:layout_constraintTop_toBottomOf="@+id/textView2"
        android:layout_marginStart="24dp"
        android:layout_marginEnd="24dp"/>

    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="log in with facebook"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="24dp"
        android:layout_marginEnd="24dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="16dp"
        app:layout_constraintTop_toBottomOf="@+id/button2"/>
</android.support.constraint.ConstraintLayout>

可能的错误是什么?这里我们将 viewModel 类实例传递给 xml 数据变量。

我是 MVVM 架构的新手。

实际上,我正在关注this link 在 mainActivity 中它正在调用 set login () 但是当我尝试调用时,它显示未解析的引用。 ——

【问题讨论】:

  • 我不知道 kotlin,但我认为变量初始化中的“登录”和通过视图中的视图模型访问时的登录存在差异
  • 我是否在此处发布我的 ViewModel 类(如果有助于理解)? @Shubham
  • @Shubham 实际上这是 ViewModel 的设置登录功能,但我在 ViewModel 中找不到任何 setLogin 功能。
  • 其实我正在关注这个链接github.com/khakhranisagar/LoginModuleMVVM/tree/master/src/main/…这里在mainActivity中它正在调用set login()但是当我试图调用时,它显示了Unresolved references。
  • 尝试将 name="Login" 更改为 name="login" 并关联查看器分配。因为您已经使用 Login 定义了变量名称,并且您正在通过 @{login.errorEmail} 访问,即 login

标签: android mvvm data-binding android-databinding


【解决方案1】:

您应该像您所遵循的示例中那样做

binding.setLogin(viewModel);

数据绑定为在activity_main.xml中声明的这个变量创建setLogin()方法

<variable
        name="Login"
        type="com.example.itstym.logina.LoginViewModel" />

如果仍然出现同样的错误,请检查变量包名和声明的 LoginViewModel 类中的拼写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 2017-06-14
    • 2018-05-12
    • 2020-09-21
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多