Fragment 共享數(shù)據(jù)新姿勢(shì)

多個(gè) Fragment 之間共享數(shù)據(jù)是很常見的需求,常見的做法是在 Fragment 中通過 Activity 來通知另外另外的 Fragment,或者使用 EventBus 等三方庫來實(shí)現(xiàn)。

Google 推出的 Jetpack 給我們提供了很多有用的工具,其中 ViewModel 和 LiveData 是最常用的工具之一,通過這兩個(gè)工具我們可以使用新的姿勢(shì)來實(shí)現(xiàn) Fragment 之間共享數(shù)據(jù)。

假設(shè)我們需要實(shí)現(xiàn)下面的效果,模擬 activity 和 viewpager 中的 Fragment 相互通信, Fragment 中修改數(shù)據(jù)另外的 Fragment 和 Activity 中跟著一起修改,Activity 中修改數(shù)據(jù)也能修改 Fragment 中的數(shù)據(jù)。

效果

首先,我們定義 ViewModel

class ViewModelTestViewModel : ViewModel() {
    val data = MutableLiveData(0)
    val str = data.map {
        it.toString()
    }

    fun updateData(value: Int) {
        data.postValue((data.value ?: 0) + value)
    }
}

在 Fragment 中使用,通過 databinding 進(jìn)行數(shù)據(jù)綁定,當(dāng)然不使用 databinding 直接監(jiān)聽 livedata 也是可以的。

 override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        // 這里使用 activity
        viewModel = ViewModelProvider(activity!!).get(ViewModelTestViewModel::class.java)
        binding.data = viewModel
        binding.lifecycleOwner = activity

        binding.plus.setOnClickListener {
            viewModel.updateData(1)
        }

        binding.minus.setOnClickListener {
            viewModel.updateData(-1)
        }
    }

注意上面在創(chuàng)建 ViewModel 的時(shí)候傳的參數(shù)是 activity 而不是 Fragment。

在 Activity 中使用

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(ViewModelTestViewModel::class.java)

        binding = DataBindingUtil.setContentView(this, R.layout.view_model_test_activity)

        binding.lifecycleOwner = this
        binding.data = viewModel

        binding.viewPager.adapter = MyAdapter(this)

        binding.plus.setOnClickListener {
            viewModel.updateData(1)
        }

        binding.minus.setOnClickListener {
            viewModel.updateData(-1)
        }
    }

這樣我們就能實(shí)現(xiàn)不同 Fragment 之間數(shù)據(jù)交互了。

完整代碼見 github

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容