2011-08-03 3 views
25

J'ai un fragment ajouté à l'aideObtenez vue conteneur fragment id

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

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

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

Peut-être que "commencer" un fragment d'un autre est une mauvaise pratique et toute la logique de gestion des fragments devrait être gérée par l'activité elle-même? Mais créer de jolies séquences de fragments les uns par rapport aux autres semble très utile (par exemple detalView-> moreDetailView-> evenMoreDetailView). Je ne sais pas si je comprends exactement votre question, mais vous obtenez le conteneur dans onCreateView.

Répondre

65

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

((ViewGroup)getView().getParent()).getId(); 
+3

il me donne null aucune idée, j'ai l'écran principal qui contiennent la mise en page que j'utilise comme parent pour les fragements quand essayer de dire LinearLayout x = (LinearLayout) ((ViewGroup) getView().getParent()); dans la classe Fragment être appelé mais il est toujours nul – AMH

+0

Travailler comme un charme, merci l'homme pour sauver mes heures –

11

Je suppose que vous pourriez le cacher dans une variable locale.

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

Vous comprenez bien. Je peux le faire de cette façon, mais cela ressemble plus à un hack pour moi. Container ici est passé pour fragment afin de pouvoir gonfler sa vue et je doute qu'il soit supposé être stocké pour une utilisation future. Y a-t-il une façon plus native d'obtenir l'ID de vue de conteneur? –

+1

Je ne vois pas ce qui ne va pas avec cette méthode. Si vous ne voulez pas stocker la vue, il suffit de stocker l'identifiant. –

5

En supposant que vous avez par exemple Fragment mCurrentFragment dans la classe d'activité. Vous pouvez obtenir une vue conteneur de Fragment via

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

(Si je comprends bien ce que vous faites) L'objet que vous avez l'ID de ** est ** l'objet que vous cherchez pour. Ces deux lignes peuvent être remplacées par la plus courte: 'ViewGroup vg = (ViewGroup) mCurrentFragment.getView(). GetParent();' Toute situation où ce ne serait pas équivalent à ce que vous avez fait? – ToolmakerSteve

+0

Yep @ToolmakerSteve, ils sont toujours équivalents. Merci d'avoir repéré ça pour moi. –

8

Je pense qu'il ya une façon plus standard d'accès à la vue plutôt que d'utiliser

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

Je suppose que vous travaillez avec un MainActivity qui présente une fragment de liste, qui peut alors présenter un autre fragment de liste en cliquant sur un élément, et ainsi de suite. 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 MainActivity, vous pouvez toujours accéder à la vue de 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 avez une ressource de mise en page XML que vous définissez dans le MainActivity, appelez la ressource XML R.layout.activity_main, où il y a un FrameLayout avec l'id R.id.content_view. C'est l'approche que j'ai prise. 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 de IntelliJ (version 1.0.1) me avertit que

((ViewGroup) getView().getParent) 

peut jeter un NullPointerException.

+1

Eh bien, quelques semaines après cette question, j'ai compris que la conception de Fragments est imparfaite au point d'être utilisable et n'a jamais utilisé de Fragments à nouveau. –

Questions connexes