J'essaie actuellement d'adapter mon application pour utiliser les "Compatibility Libraries for Android v4" afin d'offrir les avantages de l'utilisation des fragments même aux utilisateurs d'Android 1.6.
Jusqu'à présent, cela a été possible sans grands problèmes, mais l'implémentation d'un menu contextuel semble être plus délicate...
- L'activité principale de l'application est d'étendre le FragmentActivity classe.
- Les fragments sont tous basés sur une classe qui étend la classe Fragment.
- La classe de fragment appelle registerForContextMenu() dans son onCreateView() et remplace les méthodes onCreateContextMenu() y onContextItemSelected() .
Para onCreateContextMenu() ça marche plutôt bien. Le menu contextuel est gonflé à partir d'un fichier de ressources et légèrement modifié en fonction de l'élément sélectionné (qui est basé sur un listView... même si le fragment n'est pas un ListFragment).
Le problème se produit lorsqu'une entrée du menu contextuel est sélectionnée. onContextItemSelected() est appelé pour tous les fragments existants en commençant par le premier ajouté.
Dans mon cas, les fragments sont utilisés pour afficher le contenu d'une structure de dossiers. Lorsque le menu contextuel d'un fragment de sous-dossier est ouvert et qu'un élément de menu est sélectionné, onContextItemSelected() est d'abord appelé aux niveaux supérieurs (en fonction du nombre de fragments autorisés/visibles à ce moment-là).
Pour l'instant, j'utilise une solution de contournement en utilisant un champ sur le niveau d'activité qui contient la balise du dernier fragment appelant son onCreateContextMenu() . De cette façon, je peux appeler "return super.onContextItemSelected(item)" dans le début de l'instruction onContextItemSelected() lorsque la balise stockée n'est pas la même que celle de getTag(). Mais cette approche me semble un peu sale.
Pourquoi onContextItemSelected() est-il appelé sur tous les fragments ? et pas seulement sur celui qui appelait onCreateContextMenu() ? Quelle est la manière la plus élégante de traiter cette question ?
Merci à l'avance.