如何将 edittext 属性 android:enabled 与视图模型数据进行数据绑定?

How to databind edittext attribute android:enabled with viewmodel data?

要求:
我有一个用户名和一个密码 edittexts。我希望仅当在用户名编辑文本中输入有效用户名时才启用密码编辑文本。

布局代码:

<variable
    name="model"
    type="com.app.viewmodel.ViewModel" />

...

<com.google.android.material.textfield.TextInputLayout
    ...>

    <androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/username_edit_text"
        android:inputType="text"
        android:onTextChanged="@{model::onUsernameTextChanged}"
        .../>

</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
    ...>

    <androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/password_edit_text"
        android:enabled="@{safeUnbox(model.isUsernameValid)}"
        android:inputType="textPassword"
        android:onTextChanged="@{model::onPasswordTextChanged}"
        .../>

</com.google.android.material.textfield.TextInputLayout>

视图模型:

private val isUsernameValid: MutableLiveData<Boolean> = MutableLiveData()

init {
    isUsernameValid.value = false
}

fun getIsUsernameValid(): MutableLiveData<Boolean> {
    return isUsernameValid
}

fun onUsernameTextChanged(usernameString: CharSequence, start: Int, before: Int, count: Int) {
    isUsernameValid.value = (usernameString.length >= 8)

    Log.e(TAG, "${isUsernameValid.value}")
}    

在日志消息中,我可以看到输入有效用户名后 isUsernameValid 更改为 true,但之后密码编辑文本未启用。

有什么办法可以解决这个问题吗?

编辑 1:阅读@Birju Vachhani 的解决方案后。

片段代码:

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

    if (activity != null) {
        signInViewModel = ViewModelProviders.of(this).get(SignInViewModel::class.java)
        signInFragmentBinding.sharedModel = mainActivityViewModel
        signInFragmentBinding.lifecycleOwner = this
        signInFragmentBinding.model = signInViewModel
    }
}

signInFragmentBinding.lifecycleOwner = this 添加这行就解决了。

在您的 activity 中,执​​行此操作即可:

binding.lifecycleOwner = this

为了对 LiveData 更改进行绑定,需要提供 LifecyclerOwner

class MainActivity : AppCompatActivity() {

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.lifecycleOwner = this
        binding.viewModel = viewModel
    }
}