如何将 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
}
}
要求:
我有一个用户名和一个密码 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
}
}