web-dev-qa-db-fra.com

Obtenir l'ID de vue de conteneur du fragment

J'ai ajouté un fragment en utilisant

transaction.add(R.id.content, fragment, null);

et je dois commencer un nouveau fragment à partir de celui-ci. Mais pour ce faire, j'ai besoin de connaître l'ID de vue du conteneur du premier fragment (contenu R.id.c dans mon cas). Comment puis-je l'obtenir?

Je peux simplement utiliser cet identifiant directement, mais je suppose que fragment ne devrait pas connaître ce genre de détails sur l'activité des parents. Par exemple, il sera impossible d'utiliser ce fragment dans une autre activité dans ce cas.

Le fait de "démarrer" un fragment à partir d'un autre est une mauvaise pratique et toute la logique de gestion des fragments doit être gérée par l'activité elle-même? Mais créer de jolies séquences de fragments commençant les uns aux autres semble très utile (par exemple detalView-> moreDetailView-> evenMoreDetailView).

32
Dmitry Ryadnenko

Vous pouvez accéder à l'ID du conteneur en appelant

((ViewGroup)getView().getParent()).getId();
76
Behlül Uçar

Je ne sais pas si je comprends exactement votre question, mais vous obtenez le conteneur dans onCreateView. Je suppose que vous pourriez le cacher dans une variable locale.

public View onCreateView(LayoutInflater inflater, 
  ViewGroup container,
  Bundle savedInstanceState) {
  mContainer = container;
  ...
}
12
Sparky

Je pense qu'il existe un moyen plus standard d'accéder à la vue plutôt que d'utiliser

((ViewGroup) getView().getParent()).getId()

Je suppose que vous travaillez avec une MainActivity qui présente un fragment de liste, qui peut ensuite présenter un autre fragment de liste en cliquant sur un élément, etc. Je suppose que vous avez choisi de remplacer la vue principale de MainActivity par le contenu des fragments de liste que vous présentez.

Étant donné que chaque fragment de liste est hébergé dans la MainActivity, vous pouvez toujours accéder à la vue de la MainActivity.

// Inside of onListItemClick...
FragmentManager fm = getFragmentManager();
Fragment fragment = new MyOtherListFragment();

FrameLayout contentView = (FrameLayout) getActivity().findViewById(R.id.content_view);

fm.beginTransaction()
        .replace(contentView.getId(), fragment)
        .addToBackStack(null)
        .commit();

L'exemple ci-dessus suppose que vous disposez d'une ressource de disposition XML que vous définissez dans MainActivity, appelez la ressource XML R.layout.activity_main, où se trouve un FrameLayout avec l'ID R.id.content_view. C'est l'approche que j'ai adoptée. L'exemple que je présente ici est une version plus simple de celle que j'ai réellement écrite dans mon application.

Soit dit en passant, ma version d'IntelliJ (version 1.0.1) m'avertit que

((ViewGroup) getView().getParent)

peut lever une NullPointerException.

En supposant que vous avez une instance de Fragment mCurrentFragment dans la classe Activity. Vous pouvez obtenir la vue du conteneur de Fragment via

int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View
5
macio.Jun