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

时间:2018-11-06 11:32:14

标签: android mvvm kotlin android-databinding

我在应用程序中使用数据绑定,但是按钮不起作用。我在此代码中出错了。我尝试了许多解决方案,但没有运气。但是如果 activity_login.xml 中的make按钮,则单击按钮即可。我认为我无法将视图模型传递给包含的视图。 这是我的代码

activity_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>

layout_login.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">
    <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>

MainViewModel.kt

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


     fun onLoginButtonClick(view : View){

        performLogin()
    }
       .
       .
       .
}

LoginActivity.kt

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()


    }
}

0 个答案:

没有答案
相关问题