【发布时间】:2022-01-17 21:44:35
【问题描述】:
我一直在尝试制作一个应用程序,它将我的值加倍或加倍到 2 个文本视图中,当我使用 viewModel 时,它在所有配置更改中都幸存下来。当我将结果类型更改为 MutableLiveData 时,textView 值不会改变,直到我按下按钮后旋转手机。这是我的 MainFragment
class MainFragment : Fragment() {
private var _binding: MainFragmentBinding? = null
private val binding get() = _binding!!
companion object {
fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = MainFragmentBinding.inflate(inflater, container, false)
return binding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProvider(this)[MainViewModel::class.java]
binding.textView.text = viewModel.getResults().toString()
binding.textView2.text = viewModel.getResults().toString()
val resultsObserver = Observer<List<Float?>>{
binding.textView.text = it[0].toString()
binding.textView2.text = it[1].toString()
}
viewModel.getResults().observe(viewLifecycleOwner, resultsObserver)
binding.action.setOnClickListener {
if(binding.editTextNumberDecimal.text.isNotEmpty()){
viewModel.setValues(binding.editTextNumberDecimal.text.toString())
}else{
binding.textView.text = getString(R.string.no)
binding.textView2.text = getString(R.string.no1)
}
}
}
}
这是我的视图模型
class MainViewModel : ViewModel() {
private var input = ""
private var doubleValue = 0f
private var tripleValue = 0f
fun setValues(value: String){
input = value
doubleValue = input.toFloat() * 2
tripleValue = input.toFloat() * 3
}
fun getResults(): MutableLiveData<List<Float?>> = MutableLiveData(listOf(doubleValue, tripleValue))
}
【问题讨论】:
-
欢迎来到 SO。 LiveData 是一个值持有者,为了使用它,您必须观察它,然后更新它的值。我建议您花几分钟时间阅读the official documentation,其中包含底部的一个简单示例。简而言之,您需要执行
mutableld.postValue(xxx)(例如)。并且观察到的 liveData 会触发。 -
很多事情都搞清楚了,谢谢!另外,我很感激欢迎
标签: android viewmodel android-livedata android-architecture-components