如何获取其他片段的ViewModel

时间:2017-07-30 19:28:17

标签: android architecture model-view

我有一个外部事件可以改变几个片段的状态,因为我使用Android架构组件,我为每个片段创建了几个ModelView。

在ModelViews之间发送消息的正确方法是什么

2 个答案:

答案 0 :(得分:1)

我假设您正在使用viewModel来保存跨活动和片段重新创建的状态。您确实意识到viewModel本质上是您的模型类,对吧?那你为什么要在viewModels之间发送消息呢?

如果您有一个更改片段状态的外部事件,您应该将其传播到您的活动,然后他们会将这些消息发送到您可以更新视图模型状态的片段。

答案 1 :(得分:-1)

您应在活动中为活动使用一个ViewModel。然后,您可以从活动和其他片段中观察此视图模型。

例如,ViewModel下面的类可以包装你的事件

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

然后,您可以使用以下不同的片段订阅对事件的更改:

public class DetailFragment extends LifecycleFragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // update UI
        });
    }
}

订阅后,您现在可以更改事件数据,通知观察片段或活动:

public class MasterFragment extends Fragment {
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

看看sharing data between fragments。有关Android体系结构组件的Google文档有限但很好。