【问题标题】:How to bind CheckBox true/false value to my variable in ViewModel (MVVM, Android, Kotlin)如何将 CheckBox 真/假值绑定到 ViewModel 中的变量(MVVM、Android、Kotlin)
【发布时间】:2021-02-18 13:29:41
【问题描述】:

我实现了“记住我”功能,我想通过 SharedPreferences 将正确输入的信息继续存储到我的 AuthorizationActivity。

我通过 DataBinding 在我的视图(UI)上传输数据。因此,我通过 ViewModel 中的双向绑定获取值电子邮件和密码(editTexs),但我无法将 checkBox true/false 值作为 ViewModel 中的变量“onChecked”

我该如何解决这样的问题?

XML

<RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="32dp"
            android:layout_marginTop="36.7dp"
            android:layout_marginRight="32dp"
            android:background="@drawable/blue_border_rounded_cornwe">
            <!-- INPUT -->
            <EditText
                android:id="@+id/login_input"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/username_icon"
                android:background="@android:color/transparent"
                android:fontFamily="@font/poppins_regular"
                android:hint="Логин"
                android:inputType="textEmailAddress"
                android:maxLines="1"
                android:paddingLeft="17dp"
                android:paddingTop="15dp"
                android:paddingBottom="15dp"
                android:paddingRight="17dp"
                android:text="@={AuthViewModel.email}"
                android:textCursorDrawable="@drawable/cursor_color"
                android:textSize="12sp" />
            <!-- ICON -->
            <ImageView
                android:id="@+id/username_icon"
                android:layout_width="16.7dp"
                android:layout_height="12.3dp"
                android:layout_centerVertical="true"
                android:layout_marginLeft="17dp"
                android:src="@drawable/sr_email" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="32dp"
            android:layout_marginTop="12.7dp"
            android:layout_marginRight="32dp"
            android:background="@drawable/blue_border_rounded_cornwe">
            <!-- INPUT -->

            <EditText
                android:id="@+id/password_input"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/icon"
                android:background="@android:color/transparent"
                android:fontFamily="@font/poppins_regular"
                android:hint="Пароль"
                android:inputType="textPassword"
                android:maxLength="10"
                android:maxLines="1"
                android:paddingLeft="17dp"
                android:paddingRight="17dp"
                android:paddingTop="15dp"
                android:paddingBottom="15dp"
                android:text="@={AuthViewModel.password}"
                android:textCursorDrawable="@drawable/cursor_color"
                android:textSize="12sp" />
            <!-- ICON -->
            <ImageView
                android:id="@+id/icon"
                android:layout_width="16.7dp"
                android:layout_height="12.3dp"
                android:layout_centerVertical="true"
                android:layout_marginLeft="17dp"
                android:src="@drawable/sr_password" />
        </RelativeLayout>

        <CheckBox
            android:id="@+id/checkBox"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="32dp"
            android:layout_marginTop="8.7dp"
            android:buttonTint="@color/sr_theme"
            android:onClick="@{AuthViewModel::onCheckedClick}"
            android:checked="@={AuthViewModel.onChecked}"
            android:fontFamily="@font/poppins_regular"
            android:text="Запомнить" />


        <TextView
            android:id="@+id/buttoned"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="32dp"
            android:layout_marginTop="8.7dp"
            android:layout_marginRight="32dp"
            android:background="@drawable/blue_fill__rounded_color"
            android:fontFamily="@font/poppins_medium"
            android:gravity="center"
            android:onClick="@{AuthViewModel::onLoginButtonClicked}"
            android:paddingTop="14dp"
            android:paddingBottom="14dp"
            android:text="Войти"
            android:textColor="#ffffff"
            android:textSize="12sp" />

一大块 ViewModel 文件,里面有一个函数

class AuthViewModel(
private val repository: UserRepository

) : ViewModel() {

var email: String? = null
var password: String? = null
var authListener: AuthListener? = null
var onChecked: Boolean? = false







fun rememberMe (){


    var onChecked: Boolean = repository.getBoolean()
    if(onChecked == true){


        //authListener?.onActivate(repository.getInfo())
        var (login, pswrd, checked) = repository.getInfo()

        email = login
        password = pswrd
        onChecked = checked

        repository.saveAuth(email!!, password!!, onChecked!!)

        authIn()



    } else {
        authListener?.onFailure("Введите ваши данные")
    }

}

【问题讨论】:

  • 你应该从 BaseObservable 扩展你的视图模型,这样你就可以在你的视图模型中使用数据绑定

标签: android kotlin mvvm


【解决方案1】:

您应该在 XML 中导入 ViewModel 和 CompoundButton

请检查一下。

<data>

    <import type="android.widget.CompoundButton" />

    <variable
        name="task"
        type="com.example.android.architecture.blueprints.todoapp.data.Task" />

    <variable
        name="viewmodel"
        type="com.example.android.architecture.blueprints.todoapp.tasks.TasksViewModel" />
</data>
<CheckBox
        android:id="@+id/complete_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:onClick="@{(view) -> viewmodel.completeTask(task, ((CompoundButton)view).isChecked())}"
        android:checked="@{task.completed}" />

代码 sn-p 取自 google 源代码:https://github.com/android/architecture-samples/blob/main/app/src/main/res/layout/task_item.xml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 2012-03-05
    • 2019-11-15
    • 2021-12-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多