30

SharedViewModel という名前の ViewModel があります。

public class SharedViewModel<T> extends ViewModel {

    private final MutableLiveData<T> selected = new MutableLiveData<>();


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

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

Google の Arch ViewModel リファレンス ページにある SharedViewModel の例に基づいて実装しました。

https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing_data_between_fragments

アクティビティ内の 2 つ以上のフラグメントが互いに通信する必要があることはよくあります。両方のフラグメントがインターフェイスの説明を定義する必要があり、所有者アクティビティが 2 つをバインドする必要があるため、これは決して簡単なことではありません。さらに、両方のフラグメントは、他方のフラグメントがまだ作成されていない、または表示されていない場合を処理する必要があります。

と という 2 つのフラグメントがListFragmentありDetailFragmentます。

今まで、これら 2 つのフラグメントを と呼ばれるアクティビティ内で使用MasterActivityしていましたが、すべてうまくいきました。

で ViewModel を取得し、ListFragment使用する値を選択しましたDetailFragment

mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);

ただし、場合によっては、ListFragment(別のデバイス構成へのレイアウト) を という別のアクティビティに追加する必要がありますDetailActivity。上記の例と同様にそれを行う方法はありますか?

4

6 に答える 6

2

Android の MVVM フレームワークについては、いまだに混乱していると思います。別のアクティビティについては、必ずしも同じである必要があるため、混乱しないでください。なぜですか?

これは、同じロジックを持っている場合 (ロジックが他の有用なクラスで依然として抽象的である場合でも)、または XML のビューがほとんど同じである場合に意味があります。

簡単な例を見てみましょう:

vmA と呼ばれる ViewModel と A と呼ばれるアクティビティを作成します。ユーザーのデータが必要です。ユーザーの vmA にリポジトリを挿入します。

ここで、ユーザー データを読み取る必要がある別のアクティビティが必要です。vmB という別の ViewModel を作成し、その中でユーザー リポジトリを呼び出します。説明したように、リポジトリは常に同じです。

すでに提案されている別の方法は、Factory の実装で同じ ViewModel の N インスタンスを作成することです。

于 2018-11-01T18:29:56.953 に答える