android - 按钮文本不随 ViewModel 更改而更改
问题描述
我正在尝试根据用户交互更改按钮的文本。文本绑定到视图模型中的布尔变量,并且应该观察该变量的变化。当变量改变时,文本应该切换。但事实并非如此。
<?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”,但按钮文本仍然显示“未更改”。我只是看不到我在俯瞰什么。
编辑添加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
}
}
解决方案
可能是您设置的按钮文本的问题。
<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`}'/>
用反引号 (`) 符号更改它。
推荐阅读
- amazon-web-services - 污染 eks 节点组
- c# - 已声明但未找到的操作名称
- python-3.x - 如何在图像标签上放置文本 [已解决]
- java - Java 包装器内存不足
- flutter - 在 Flutter 应用程序中设置默认语言
- sql-server - 如何使用 Golang SDK 查询 RDS 的任意表
- yaml - 在 Azure Pipline 中将数字格式化为 4 位数字
- flask - 烧瓶管理员的单独数据库
- angular - 如何在 Angular Web 中显示 blob 内容(doc、ppt、xls)
- okhttp - OkHttp 是否信任个人 CA?