web-dev-qa-db-ja.com

Android MVVM:複数のフラグメントがあるアクティビティ-共有LiveDataを配置する場所は?

Android ViewModelsについてアーキテクチャ上の質問があります:

私のアプリでは、(Viewpagerを使用して)2つのフラグメントを含むアクティビティがあります。 2つのフラグメントは異なる処理を実行します(したがって、独自のViewModelを持っている可能性があります)が、どちらも同様のさまざまなデータを必要とします。

これは、たとえば、ネットワーク接続が使用可能かどうか(および接続がない場合は両方のフラグメントに異なるエラーUIが表示される)、またはサーバーからプッシュ経由で来て両方のフラグメントに等しく影響するユーザー設定の状態です。

これは次のようになります。

enter image description here

今私の質問は、ViewModelsを使用するときにその状況に対処する方法ですか?ビューが複数のViewModelを監視するのは良いことです。たとえば、次のように、アクティビティのViewModel(両方が等しく必要な状態を保持)と各フラグメントに1つのViewModelがある場合のようになります。

enter image description here

これは here が示唆されましたが、 MVVMの関係 は一般的に

ビューn-1 ViewModel n-1モデル

しかし、私の場合、そのような共有LiveDataの適切な場所がどこにあるのかわかりませんか?

28
stamanuel

ViewModelの背後にあるコンセプトは、「View」ではなく、単一の「Screen」に関連することになっていると思います。 「。したがって、そのロジックでは、複数のフラグメントが同じViewModelを参照している場合、技術的には同じ「Screen」に属するため、同じViewModelを使用できると思います。

フラグメントでは、LiveDataのインスタンスを保持するViewModelのアクティビティを要求し、必要に応じて更新を提供できます。

これがあなたの質問に答えることを願っています。

更新: Googleサンプルのサンプルフラグメントへのリンク が見つかりました。 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();
}

追伸より良い解決策/答え/練習を見つけたなら、lemmeは知っています。

9
karthik prasad