我們之前在Activity和Fagment之間傳值一般使用構(gòu)造,回調(diào)。等等方式,但是這種存在內(nèi)存泄漏和空構(gòu)造異常,現(xiàn)在官方提供了更友好的ViewModel進(jìn)行傳值,并且可以
跟隨Activity和Fragment的生命周期,完全解耦這個(gè)是官方地址:https://developer.android.google.cn/topic/libraries/architecture/viewmodel
需要依賴Fragment的擴(kuò)展函數(shù)庫(kù)
implementation "androidx.fragment:fragment-ktx:1.2.5"
我們建立一個(gè)需要傳值的Viemodel類,這里只是簡(jiǎn)單傳遞個(gè)boolean值
package com.example.jitpackdemo.ui.main
import android.content.ClipData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<Boolean>()
}
- 在Mactivity中關(guān)聯(lián)此ViewModel
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
var shareModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commitNow()
}
shareModel.selected.value= true
}
}
可以看到這里我們區(qū)改變了數(shù)值為true
- Fragment中我們只需要
private val model: SharedViewModel by activityViewModels1()
引入剛才我們創(chuàng)建的viewModel
class MainFragment : Fragment() {
companion object {
fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
private val model: SharedViewModel by activityViewModels1()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.main_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
model.selected.observe(viewLifecycleOwner, Observer {
Toast.makeText(activity,it.toString(),Toast.LENGTH_SHORT).show()
})
}
}
這樣我們就可以在Fragment中正常收到我們從Activity的數(shù)值了