我正在尝试根据用户交互更改按钮的文本。文本绑定到视图模型中的一个布尔变量,并且应该观察该变量的变化。当变量改变时,文本应该切换。但事实并非如此。
<?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"
xmlns:tools="http://schemas.android.com/tools"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="userDataViewModel"
type="com.mysite.myapp.viewModels.UserDataViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/change_group_location_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragments.GroupLocationFragment">
<Button
android:id="@+id/select_location_button"
android:layout_width="match_parent"
android:layout_height="64dp"
android:text='@{userDataViewModel.userData.groupChanged ? "changed" : "not changed"}'/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
下面是我绑定视图模型的片段部分:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_group_location, container, false)
binding.lifecycleOwner = this
userDataViewModel = activity?.run {
ViewModelProviders
.of(this, UserDataViewModelFactory(prefs, userDataFetcherService))
.get(UserDataViewModel::class.java)
} ?: throw Exception("Invalid Activity")
userDataViewModel
.getUserData()
.observe(this, Observer {
binding.userDataViewModel = userDataViewModel
})
return binding.root
}
我可以看到视图模型中的布尔变量切换为“true”,但按钮文本仍然显示“not changed”。我只是看不到我忽略了什么。
编辑
加入
ViewModel
以防出现问题。
class UserDataViewModel(private val prefs: SharedPreferences): ViewModel() {
val userData: MutableLiveData<UserData> by lazy {
MutableLiveData<UserData>().also {
val userDataString = prefs.getString(UserData.USER_DATA_SHARED_PREFERENCE_KEY, "")
it.value = Gson().fromJson(userDataString, UserData::class.java)
}
}
fun getUserData(): LiveData<UserData> {
return userData
}
}