Fragment Bundle的实际用途

最近在研发兼容OSGi R4.1规范的运行环境 BOND(前身为MINIOSGi),发现 Fragment Bundle 用处很大,它可以使用在下面实际应用场景中:

 

1. 为其他Bundles进行扩展实现,类似于Java中接口(Host Bundle,以下称HB)和实现类(Fragment Bundle,以下称FB)的作用。例如 org.eclipse.swt_x.x.x 这个包,它是一个HB,导出的包名都是通用的包名,像 org.eclipse.swt.widget、org.eclipse.swt.graphics 等,附属于它的包有 org.eclipse.swt.win32_x.x.x、org.eclipse.swt.gtk_x.x.x等 FBs,用于对不同操作系统环境的提供SWT实现。

 

2. 程序国际化消息包,例如 一个 Bundle 如果使用了 ResourceBundle 来为其提供国际化文字,如果别人想加入自己本地语言的文字怎么办?答案是,创建一个附属于它的FB,并根据其主包路径放入消息文件。这么做的好处就是不用修改源Bundle内容,直接安装这个FB就能达到效果,真正的动态部署。如图:
 

附主 Bundle,只有一个 messages.properties 文件用于默认语言的显示。
 

附属 Bundle,提供了英文和中文两种语言的显示。

 

3. 作为Framework的扩展包,就是注入到OSGi运行环境中,为所有Bundles提供支持。

在ViewModel中更新FragmentBundle通常是在处理数据变化或者用户操作后的回调里完成的。首先,你需要确保ViewModel有保存和更新Bundle的方法。假设你有一个`MyViewModel`类: ```kotlin class MyViewModel : ViewModel() { private val bundle = Bundle() // 更新数据或状态后,可以将新值放入Bundle并通知Fragment fun updateData(newValue: String) { bundle.putString("key", newValue) // 触发观察者(如果已设置),通知Fragment更新 lifecycleScope.launch { notifyDataChange() } } // 这个方法用于在Fragment中订阅ViewModel的变化,并处理新的Bundle fun observeDataChanges(fragment: MyFragment): LiveData<Bundle> { return livedata { emit(bundle) } // 使用LiveData传递实时的数据更新 } // 可能需要的一个私有函数,用于在内部触发数据变更 private fun notifyDataChange() { // 如果有观察者注册,这里调用其update方法 for (observer in observers) { observer.update(bundle) } } } ``` 然后,在你的Fragment中,你需要订阅ViewModel的数据变化: ```kotlin class MyFragment : Fragment() { private lateinit var viewModel: MyViewModel override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) viewModel.observeDataChanges(object : ViewModelObserver<Bundle> { override fun onChanged(data: Bundle) { // 在此处处理接收到的新Bundle,比如更新界面显示 if (data != null) { arguments = data // 将新数据传入当前Fragment的Args } } }) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值