2013-03-19 28 views
35

Cóż, mam prosty <FrameLayout>:Pobierz Fragment dynamicznie dołączony do <FrameLayout>?

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/FragmentContainer" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

Wtedy w moim kodu, dodałem fragment do niego:

FragClass aFrag = new FragClass(); 
getSupportFragmentManager().beginTransaction() 
     .replace(R.id.FragmentContainer, aFrag).commit(); 

i gdzieś indziej w moim kodu, chcę, aby ta FragClass (extends Fragment) przedmiot z identyfikatora R.id.FragmentContainer.

Próbowałem

((ViewGroup) findViewById(R.id.FragmentContainer)).getChildAt(0) 

lub

((FrameLayout) findViewById(R.id.FragmentContainer)).getChildAt(0) 

ale wracają do View zamiast Fragment dołączonym do niego.

Wiem, że mogę przechowywać zmienną aFrag gdzieś, więc nie muszę jej ponownie znajdować. Sądzę jednak, że powinien istnieć sposób na jej odzyskanie.

+1

http://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById%28int%29 – Luksprog

+0

Dzięki za odpowiedź @Luksprog. Ale nie mogę dodać identyfikatora do aFrag. – midnite

+0

Nie, nawet jeśli używasz powyższej metody z 'R.id.FragmentContainer'? – Luksprog

Odpowiedz

74

Pozwól mi owinąć go przez pełną odpowiedź :)

W tym przypadku dynamicznie dodawane Fragment wykorzystuje identyfikator pojemnika View (ViewGroup).

ref: http://developer.android.com/guide/components/fragments.html#Adding

Uwaga: Każdy fragment wymaga unikalnego identyfikatora, że ​​system można wykorzystać do odtworzenia fragmentu, jeżeli działalność jest wznowiona (i które można wykorzystać, aby uchwycić fragment wykonywać transakcje, takie jak go usunąć). Istnieją trzy sposoby dostarczenia identyfikatora fragmentu:

  • Podaj atrybut android: id z unikalnym identyfikatorem.
  • Podaj atrybut android: tag z unikalnym ciągiem znaków.
  • Jeśli nie podano żadnego z dwóch poprzednich, system używa identyfikatora widoku kontenera.

To dlatego, że jest to Fragment przecież musimy użyć getSupportFragmentManager().findFragmentById() aby je odzyskać, która zwraca Fragent, zamiast findViewById() który zwraca View.

Więc odpowiedź na ten problem byłoby:

((aFrag) getSupportFragmentManager().findFragmentById(R.id.FragmentContainer)) 

Dzięki @Luksprog.

+0

Może zwrócić wartość zerową po uruchomieniu działania kontenera? –

+0

@HassanMakarov - Dzięki za komentarz. Przepraszam, że nie kodowałem Androida przez kilka lat. Więc proszę, przyjmij moją odpowiedź z przymrużeniem oka. Jak mam dołączony aFrag do FragmentContainer, dlaczego zwraca zerowy? Czy mógłbyś wyjaśnić więcej? – midnite

+0

Fragment nie jest podklasą widoku, więc widok kontenera może mieć ten sam identyfikator z fragmentem. Dobrze? – Chao