Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用数据绑定访问包含布局中的按钮_Android_Mvvm_Kotlin_Android Databinding - Fatal编程技术网

Android 如何使用数据绑定访问包含布局中的按钮

Android 如何使用数据绑定访问包含布局中的按钮,android,mvvm,kotlin,android-databinding,Android,Mvvm,Kotlin,Android Databinding,我正在应用程序中使用数据绑定,但按钮不起作用。我在代码中哪里出错了。我尝试了许多解决办法,但没有成功。但是,如果在活动_login.xml中创建按钮,则按钮单击有效。我想我无法将视图模型传递给包含的视图。 这是我的密码 activity\u login.xml <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"

我正在应用程序中使用数据绑定,但按钮不起作用。我在代码中哪里出错了。我尝试了许多解决办法,但没有成功。但是,如果在活动_login.xml中创建按钮,则按钮单击有效。我想我无法将视图模型传递给包含的视图。 这是我的密码

activity\u login.xml

    <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:bind="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
                name ="loginViewModel"
                type="com.innowi.checoutrestaurantdashboard.view.main.MainViewModel"/>
    </data>

    <android.support.constraint.ConstraintLayout

            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/login_constraint_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/login_background_burgerstack"
            android:isScrollContainer="false"
            android:paddingEnd="32dp"
            android:paddingStart="32dp"
            tools:context=".view.main.LoginActivity">



        <include
                android:id="@+id/login_layout"
                layout="@layout/layout_login"
                android:layout_width="0dp"
                android:layout_height="0dp"
                bind:loginViewModel="@{loginViewModel}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

    </android.support.constraint.ConstraintLayout>
</layout>
    <?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">
    <data>
        <variable
                name ="loginViewModel"
                type="com.innowi.checoutrestaurantdashboard.view.main.MainViewModel"/>
    </data>

<android.support.constraint.ConstraintLayout


    style="@style/Login"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:isScrollContainer="false"
    android:padding="32dp">

    <Button
        android:id="@+id/login_button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:background="@drawable/button_login_drawable"
        android:enabled="false"
        android:gravity="center"
        android:paddingBottom="16dp"
        android:paddingTop="16dp"
        android:text="@string/button_sign_in"
        android:textColor="@color/colorWhite"
        android:textSize="24sp"
        android:onClick="@{loginViewModel::onLoginButtonClick}"
        app:layout_constraintLeft_toLeftOf="@+id/login_username"
        app:layout_constraintRight_toRightOf="@+id/login_username"
        app:layout_constraintTop_toBottomOf="@+id/login_password" />
.
.
.
.

</android.support.constraint.ConstraintLayout>
</layout>
LoginActivity.kt

class MainViewModel @Inject constructor(
    private val loginRepository: LoginRepository
) : BaseViewModel() {


     fun onLoginButtonClick(view : View){

        performLogin()
    }
       .
       .
       .
}
class LoginActivity : AppBaseActivity() {

    private lateinit var loginViewBinding: ActivityLoginBinding
    private lateinit var viewModel: MainViewModel
    private val TAG = LoginActivity::class.simpleName

    override fun initViewModel(viewModelProvider: ViewModelProvider): BaseViewModel? {
        viewModel = viewModelProvider.get(MainViewModel::class.java)
        return viewModel
    }

    override fun render(state: ViewState) {
        when (state) {
            is LoadingState -> {
                // loading
                val loading = state.loading
                Log.d(TAG,"Loading State")
            }
            is DefaultState -> {
                // render Data
                val data = state.data
                Log.d(TAG,"Data State")
            }
            is ErrorState -> {
                // show error
                val error = state.error
                Log.d(TAG,"Loading State")
            }
        }
    }

    override fun setContentView() {
        loginViewBinding = DataBindingUtil.setContentView(this, R.layout.activity_login)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        loginViewBinding.loginViewModel = viewModel
        loginViewBinding.executePendingBindings()


    }
}

上面的代码工作正常,但有一个错误,我的按钮没有启用,就是这样。您在xml
android:enabled=“false”
中禁用了按钮-这就是为什么单击不发生的原因。如果您将该属性更改为
true
,按钮将按预期开始工作。您在哪里调用方法
initViewModel