没有比这个ViewModel更好的解决方案了
首先在build.gradle中添加这个依赖:implementation 'android.arch.lifecycle:extensions:1.1.1'
您的ViewModel 课程将如下所示:
class MyViewModel: ViewModel() {
val mCartInfo: MutableLiveData<Int> = MutableLiveData()
private var cnt = 0
fun addToCartCounter() {
//TODO Apply your logic here
mCartInfo.value = cnt++
}
}
LiveData 是什么? See here
之后你必须初始化你的ViewModel并观察变化的数据,所有这些都将在你的AppBar的Activity中完成:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
//These will observe any changes happen in ViewModel's MutableLiveData(it'll directly jump inside Observer)
//Observer is main important thing
myViewModel.mCartInfo.observe(this, Observer {
//tvCartCounter is Toolbar's TextView
tvCartCounter.text = it.toString()
})
}
}
在您的Fragment 中获取ViewModel,然后单击调用ViewModel 方法的按钮:
class BlankFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val rootView = inflater.inflate(R.layout.fragment_blank, container, false)
//Get your Activity's ViewModel
val myViewModel = ViewModelProviders.of(requireActivity()).get(MyViewModel::class.java)
//Button click
rootView.btnAddToCart.setOnClickListener {
//It'll call ViewModel's method
myViewModel.addToCartCounter()
}
return rootView
}
}
每当addToCartCounter() 调用您的按钮单击时,它会在触发您的观察者后不久在MutableLiveData 中添加值。