首页 > 解决方案 > 按钮文本不随 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
    }
}

标签: androidandroid-databinding

解决方案


可能是您设置的按钮文本的问题。

<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`}'/>

用反引号 (`) 符号更改它。


推荐阅读