Outils pour utilisateurs

Outils du site


lang:android:fragment

Ceci est une ancienne révision du document !


Table des matières

Communication

FragmentResult

On stocke dans le FragmentManager une action a effectuée quand une clé est appelée.

Puis on génère une événement avec cette clé avec éventuellement des données associées (ou un Bundle vide à défaut).

  • Génération de l'événement :
getParentFragmentManager().setFragmentResult("key", new Bundle())
  • Observateur :
getSupportFragmentManager().setFragmentResultListener("key", this, (requestKey, result) -> {...});

On utilise getSupportFragmentManager() depuis une activity et getParentFragmentManager depuis un fragment.

Il est aussi possible d'appeler clearFragmentResultListener depuis l'action de setFragmentResultListener si on souhaite, par exemple, que le listener n'écoute que le premier appel.

The right way to get a result. Part 2. Fragment Result API Archive du 31/05/2021 le 22/08/2023

LiveData

LiveData est un champ qui peut être observé. Il s'implémente sur la base d'une classe ViewModel.

public class ItemViewModel extends ViewModel {
  private final MutableLiveData<Item> selectedItem = new MutableLiveData<Item>();
  public void selectItem(Item item) {
    selectedItem.setValue(item);
  }
  public LiveData<Item> getSelectedItem() {
    return selectedItem;
  }
}

Ici, Item est soit une classe contenant une ou plusieurs données.

Les données LiveData sont perdues à la fermeture de l'application.

Quand un observateur commence à surveiller un LiveData, si une valeur a déjà été assignée, la callback est immédiatement appelée (depuis le thread de l'UI).

Un LiveData est commun à tous les éléments ayant le même cycle de vue du constructeur.

Observateur depuis l'Activity. On utilise this avec ViewModelProvider car tous les fragments vont avoir la même Activity.

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  viewModel = new ViewModelProvider(this).get(ItemViewModel.class);
  viewModel.getSelectedItem().observe(this, item -> {
    // Perform an action with the latest item data.
  });
}

Modificateur depuis un fragment. Ici, on utilise requireActivity car tous les fragments vont avoir la même Activity. Si, par exemple, on souhaite que chaque fragment ait sont `LiveData` à soit, on pourrait remplacer requireActivity() par this.

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
  super.onViewCreated(view, savedInstanceState);
  viewModel = new ViewModelProvider(requireActivity()).get(ItemViewModel.class);
  ...
  viewModel.select(item);
}
lang/android/fragment.1692716772.txt.gz · Dernière modification : 2023/08/22 17:06 de root