Disons que nous avons deux fragments: MainFragment
et SelectionFragment
. Le second est conçu pour sélectionner un objet, par exemple un nombre entier. Il existe différentes approches pour recevoir le résultat de ce deuxième fragment comme les rappels, les bus, etc.
Maintenant, si nous décidons d'utiliser le composant d'architecture de navigation afin de naviguer vers le deuxième fragment, nous pouvons utiliser ce code:
NavHostFragment.findNavController(this).navigate(R.id.action_selection, bundle)
où bundle
est une instance de Bundle
(bien sûr). Comme vous pouvez le voir, il n'y a pas d'accès à SelectionFragment
où nous pourrions mettre un rappel. La question est, comment recevoir un résultat avec le composant Architecture de navigation?
Selon Google: vous devriez essayer d'utiliser le ViewModel partagé . Consultez l'exemple ci-dessous de Google:
ViewModel partagé qui contiendra des données partagées et est accessible à partir de différents fragments.
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;
}
}
MasterFragment qui met à jour ViewModel:
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);
});
}
}
DétailsFragment qui utilise le ViewModel partagé:
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.
});
}
}