代码之家  ›  专栏  ›  技术社区  ›  AndroidDev

按钮文本不随ViewModel更改而更改

  •  0
  • AndroidDev  · 技术社区  · 5 年前

    我正在尝试根据用户交互更改按钮的文本。文本绑定到视图模型中的一个布尔变量,并且应该观察该变量的变化。当变量改变时,文本应该切换。但事实并非如此。

    <?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
        }
    }
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Paresh Mayani jeet    5 年前

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

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

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

        2
  •  0
  •   Paresh Mayani jeet    5 年前

    可以使用字符串中的字符串。xml也如下所示

    <Button
            android:id="@+id/select_location_button"
            android:layout_width="match_parent"
            android:layout_height="64dp"
            android:text="@{userDataViewModel.userData.groupChanged ? @string/txt_changed : @string/txt_not/-changed}"