2011-08-03 23 views
25

Mam fragment dodawane przy użyciuPobierz fragment widoku pojemnik id

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

i muszę zacząć nowy fragment z tego. Ale aby to zrobić, muszę znać identyfikator pierwszego kontenera w widoku fragmentu (R.id.content w moim przypadku). Jak mogę to zdobyć?

Mogę użyć tego identyfikatora bezpośrednio, ale przypuszczam, że fragment nie powinien znać takich szczegółów dotyczących aktywności rodziców. Na przykład niemożliwe będzie użycie tego fragmentu w innym działaniu w tym przypadku.

Może być "początkowym" fragmentem z innego jest złą praktyką i cała logika obsługi fragmentów powinna być obsługiwana przez samo działanie? Ale tworzenie ładnych sekwencji fragmentów zaczynających się od siebie wydaje się całkiem przydatne (na przykład detalView-> moreDetailView-> evenMoreDetailView).

Odpowiedz

65

można uzyskać dostęp identyfikator kontenera przez wywołanie

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

daje mi zerowy pomysł, mam główny ekran, który zawiera układ, którego używam jako rodzica dla fragingów, gdy próbuję powiedzieć LinearLayout x = (LinearLayout) ((ViewGroup) getView().getParent()); w klasie Fragment należy się nazywać, ale zawsze jest ona pusta – AMH

+0

Działa jak zaklęcie, dziękuje człowiekowi za uratowanie moich godzin –

11

Nie wiem, czy dokładnie rozumiem twoje pytanie, ale otrzymujesz Container w onCreateView. Przypuszczam, że możesz go ukryć w zmiennej lokalnej.

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

Rozumiesz to dobrze. Mogę to zrobić w ten sposób, ale wydaje mi się, że jest to bardziej włamywacz. Pojemnik tutaj jest przekazywany do fragmentu, aby móc nadmuchać jego widok i wątpię, czy ma być przechowywany do przyszłego użytku. Czy istnieje jakiś bardziej rodzimy sposób uzyskania identyfikatora widoku kontenera? –

+1

Nie widzę, co jest nie tak z tą metodą. Jeśli nie chcesz zapisywać widoku, po prostu zapisz identyfikator. –

5

zakładając, że masz Fragment wystąpienie mCurrentFragment w klasie aktywny. można uzyskać fragment za pojemnik View poprzez

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

(Jeśli dobrze rozumiem, co robisz) Obiekt, do którego masz identyfikator od ** to ** obiekt, którego szukasz dla. Te dwie linie można zastąpić krótszymi: 'ViewGroup vg = (ViewGroup) mCurrentFragment.getView(). GetParent();' Każda sytuacja, w której nie byłoby to równoważne z tym, co zrobiłeś? – ToolmakerSteve

+0

Yep @ToolmakerSteve, są zawsze równoważne. Dzięki za to, że zauważyłeś to. –

8

myślę, że jest bardziej standardowy sposób dostępu do widoku zamiast używać

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

będę zakładać, że pracujesz z główną działalność, która stwarza fragment listy, który może następnie wyświetlić inny fragment listy po kliknięciu elementu i tak dalej. Zakładam, że zdecydowałeś się zastąpić główny widok MainActivity zawartością fragmentów list, które prezentujesz.

Ponieważ każdy fragment listy jest hostowany w MainActivity, zawsze można uzyskać dostęp do widoku 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(); 

Powyższy przykład zakłada, że ​​zasób układu XML, które ustawia się w główną działalność, zadzwoń zasób XML R.layout.activity_main, gdzie istnieje FrameLayout z identyfikatorem R.id.content_view. Takie podejście podjąłem. Przedstawiony tutaj przykład jest prostszą wersją od tej, którą napisałem w mojej aplikacji.

Nawiasem mówiąc, moja wersja IntelliJ (wersja 1.0.1) ostrzega mnie, że

((ViewGroup) getView().getParent) 

może rzucać NullPointerException.

+1

Cóż, kilka tygodni po tym pytaniu zrozumiałem, że projekt Fragments jest wadliwy poza punktem użyteczności i nigdy nie używał ponownie Fragmentów. –

Powiązane problemy