web-dev-qa-db-fra.com

Comment obtenir un résultat d'un fragment à l'aide du composant d'architecture de navigation?

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)

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?

20
Nominalista

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.
        });
    }
}
10
Amir Latifi