Android MVVM:具有多个片段的活动-将共享的LiveData放在何处?

Android MVVM:具有多个片段的活动-将共享的LiveData放在何处?,android,mvvm,android-viewmodel,Android,Mvvm,Android Viewmodel,我有一个关于android ViewModels的架构问题: 假设在我的应用程序中,我有一个包含两个片段的活动(使用Viewpager)。这两个片段做不同的事情(因此可能有自己的ViewModel?),但它们也都需要相似的各种数据 例如,这是网络连接可用或不可用的状态(如果没有连接,两个片段显示不同的错误UI),或者是通过服务器推送来的某个用户设置,对两个片段的影响相同 这看起来像这样: 现在我的问题是在使用ViewModels时如何处理这种情况? 一个视图观察多个ViewModel是否好,就

我有一个关于android ViewModels的架构问题:

假设在我的应用程序中,我有一个包含两个片段的活动(使用Viewpager)。这两个片段做不同的事情(因此可能有自己的ViewModel?),但它们也都需要相似的各种数据

例如,这是网络连接可用或不可用的状态(如果没有连接,两个片段显示不同的错误UI),或者是通过服务器推送来的某个用户设置,对两个片段的影响相同

这看起来像这样:

现在我的问题是在使用ViewModels时如何处理这种情况? 一个视图观察多个ViewModel是否好,就像我有一个活动的ViewModel(保持两个都需要的状态)和一个片段的ViewModel一样,如下所示:

例如,有人暗示过这一点,但这并不是一个好的做法,通常情况下是这样的

视图n-1视图模型n-1模型


但我不确定在我的情况下,这种共享的实时数据的正确位置在哪里?

我认为ViewModel背后的概念是,它应该与单个“屏幕相关,而不是与“视图相关”。按照这个逻辑,如果多个片段引用同一个ViewModel,我认为可以使用同一个ViewModel,因为它们在技术上属于同一个“屏幕”

在片段中,您可以为保存LiveData实例的ViewModel请求活动,并根据需要提供更新

希望这能回答你的问题

更新:我找到了。签出onCreateView()方法。粘贴代码如下,以供参考:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View root = inflater.inflate(R.layout.addtask_frag, container, false);
    if (mViewDataBinding == null) {
        mViewDataBinding = AddtaskFragBinding.bind(root);
    }

    mViewModel = AddEditTaskActivity.obtainViewModel(getActivity());

    mViewDataBinding.setViewmodel(mViewModel);

    setHasOptionsMenu(true);
    setRetainInstance(false);

    return mViewDataBinding.getRoot();
}

如果你找到了更好的解决方案/答案/实践,让我知道

回答晚了,但我问了自己同样的问题,并在谷歌指南中找到了答案。 特别是对于片段,Google文档中明确提到了它

class-SharedViewModel:ViewModel(){
val selected=MutableLiveData()
乐趣选择(项目:项目){
selected.value=项目
}
}
类MasterFragment:Fragment(){
私有lateinit变量项选择器:选择器
//使用“by activityViewModels()”Kotlin属性委托
//来自片段ktx工件
私有val模型:按activityViewModels()列出的SharedViewModel
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
itemSelector.setOnClickListener{item->
//更新用户界面
}
}
}
类DetailFragment:Fragment(){
//使用“by activityViewModels()”Kotlin属性委托
//来自片段ktx工件
私有val模型:按activityViewModels()列出的SharedViewModel
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
model.selected.observe(视图生命周期所有者,观察者{item->
//更新用户界面
})
}
}

在我看来,对于需要执行“业务逻辑”操作的每个活动/片段,都应该有一个ViewModel。基本上是在ViewModel中操作数据,这些数据会显示在视图中或保存到数据库中。@joao86是的,我知道。但是,如何处理同一活动中处于同一级别的多个片段所需的状态?您可以对多个片段/活动使用一个ViewModel,否则您将不必要地重复代码和行为。我在问题中提到了这一点,并将其两个方面联系起来。虽然这是可能的,但通常认为这是一种不好的做法,在MVVM中,视图应该只有一个ViewModel。请看我问题中的链接和文本。这可能被认为是一种不好的做法,但重复代码和行为也被认为是一种不好的做法,这就是为什么在JAVA中存在超级类的概念。那么应该遵循哪一种良好行为呢?:)您好@karithik,您提供的示例是另一种情况,如果您进一步检查代码,您将看到一个名为
AddEditTaskActivity
的单独活动,它有一个片段
AddEditTaskFragment
和一个绑定到这两个类的单一视图模型,这不是问题所指定的。我认为这是一个更一般的问题,关于-我可以在活动和片段之间共享一个viewModel吗?如果他们有一个共同的代码或共同的“状态”,那么这样做似乎是可以的。我粘贴的代码只是一个示例。因此,从理论上讲,可以使用活动的ViewModel中的公共“状态”或代码生成多个片段。这回答了你的评论吗?