Last Google IO で、Google はいくつかの新しいアーキテクチャ コンポーネントのプレビューをリリースしました。そのうちの 1 つは ViewModel.
docs googleでは、このコンポーネントの可能な用途の 1 つを示しています。
アクティビティ内の 2 つ以上のフラグメントが互いに通信する必要があることはよくあります。両方のフラグメントがインターフェイスの説明を定義する必要があり、所有者アクティビティが 2 つをバインドする必要があるため、これは決して簡単なことではありません。さらに、両方のフラグメントは、他方のフラグメントがまだ作成されていない、または表示されていない場合を処理する必要があります。
この共通の問題点は、ViewModel オブジェクトを使用して対処できます。ユーザーがリストからアイテムを選択するフラグメントと、選択したアイテムの内容を表示する別のフラグメントがある、マスター/ディテール フラグメントの一般的なケースを想像してみてください。
これらのフラグメントは、アクティビティ スコープを使用して ViewModel を共有し、この通信を処理できます。
実装例を示します。
public class SharedViewModel extends ViewModel {
private final SavedStateHandle state;
public SharedViewModel(SavedStateHandle state) {
this.state = state;
}
private final MutableLiveData<Item> selected = state.getLiveData("selected");
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
@Override
protected void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(getActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
@Override
protected void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(getActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, { item ->
// update UI
});
}
}
アクティビティを介して通信するためにフラグメントに使用されるインターフェイスを必要としない可能性について、私は非常に興奮していました。
しかし、Google の例では、マスターから詳細フラグメントを呼び出す方法が正確に示されていません。
fragmentManager.replace(...) を呼び出すアクティビティによって実装されるインターフェイスを使用する必要がありますか、それとも新しいアーキテクチャを使用してそれを行う別の方法がありますか?