MainFragment
とSelectionFragment
の2つのフラグメントがあるとしましょう。 2つ目は、オブジェクトを選択するためのビルドです。整数。この2番目のフラグメントからの結果を受け取るには、コールバック、バスなどのさまざまなアプローチがあります。
ここで、2番目のフラグメントに移動するためにナビゲーションアーキテクチャコンポーネントを使用することにした場合、次のコードを使用できます。
NavHostFragment.findNavController(this).navigate(R.id.action_selection, bundle)
ここで、bundle
はBundle
のインスタンスです(もちろん)。ご覧のとおり、コールバックを配置できるSelectionFragment
へのアクセスはありません。問題は、ナビゲーションアーキテクチャコンポーネントで結果を受け取る方法ですか?
Googleによると: 共有ViewModelを使用する必要があります 。以下のGoogleの例を確認してください。
共有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;
}
}
ViewModelを更新するMasterFragment:
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);
});
}
}
共有ViewModelを使用するDetailsFragment:
public class DetailFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, item -> {
// Update the UI.
});
}
}