2011-10-23 24 views
8

Chciałbym zaimplementować w mojej aplikacji projekt Multi-Fragments o pojedynczej aktywności. Planuję mieć kilka "ekranów" (layouts of Fragment), które będę przełączał (prawdopodobnie dodając do back-stacka) w kodzie.Android - Zmień układ fragmentów w środowisku wykonawczym

Moim zdaniem układ fragmentów na każdym ekranie jest ustawiany za pomocą obiektów Układu (np. FrameLayout), które działają jako symbole zastępcze dla fragmentów (dzielą ten sam identyfikator). Ponieważ różne ekrany mają różne układy Fragmentów (jeden może być FrameLayout i inny LinearLayout itp.) Zastanawiałem się: Jak przełączać się między układami fragmentów w środowisku wykonawczym?

Rozumiem dodawanie/zastępowanie Fragmentów (przez FragmentManager), ale chciałbym całkowicie dodać nowy układ, który je zawiera, w ramach aktywności na żywo. Podobne do transakcji "setContentView" ...

Jak to zrobić? Dzięki! Danny.

+0

Opublikowałem kod pojedynczych fragmentów wielu czynności tutaj: http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391 # 7799391 – user999717

+0

Dzięki za szybką odpowiedź. Myślę jednak, że przełączanie się między fragmentami w tym samym układzie, co przykładowy przykład ('R.id.mainframe'), nie rozwiązuje mojego problemu, czyli jak przełączać się między układami fragmentów. Zwłaszcza jeśli układy są tworzone w kodzie (po wywołaniu komendy onContentView), podobnie jak w przypadku. – DannyA

+0

Och, widzę, więc chcesz ponownie zastrzec istniejące fragmenty bez ich ponownego tworzenia? To interesujące. – user999717

Odpowiedz

4

Jest to z pewnością możliwe, jedyne, co musisz zrobić, to wygenerować własne identyfikatory. Identyfikatory mogą być dowolne, ale nie mogą być w konflikcie z aapt ID (te w R) i nie mogą być ujemne.

Poniższy przykład ilustruje to z zestawem stałych identyfikatorów:

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

W celu przełączenia na inny układ, można usunąć fragmenty i dodać je gdzie indziej.
Daj mi znać, jak to działa.

EDYCJA: w celu wyjaśnienia, widoki i grupy widoków nie muszą być tworzone raz, a następnie przechowywane przez cały czas trwania działania. Upewnij się, że wszystkie fragmenty zostały usunięte lub odłączone przed usunięciem powiązanego widoku. Ponadto, jeśli tworzysz i usuniesz widoki poza onCreate, powinieneś upewnić się, że można je przywrócić za pomocą metody onSaveInstanceState i powtórzyć proces w onCreate. Przeczytaj diagram here i akapit o configuration changes.

+0

Dzięki za wysiłek! Ponieważ jestem początkującym użytkownikiem Androida, chcę się upewnić, że rozumiem Cię poprawnie - czy można dodawać/usuwać widoki i układy z głównego widoku mojej aktywności praktycznie w dowolnym miejscu w moim kodzie, a nie tylko w onCreate (I nie sądzę, że widziałem przykłady na to), a następnie tworzyć i dodawać do nich fragmenty w locie? To coś więcej niż "usuwanie fragmentów i dodawanie ich gdzie indziej", ponieważ tworzę dla nich nowy układ. – DannyA

+0

Celem jest ostatecznie oddzielenie tej logiki fragmentu od różnych klas "ekranowych", a każda klasa powinna znać swoje własne identyfikatory układu i umieszczać w nich własne fragmenty. Następnie mogę przechodzić z jednego "ekranu" do drugiego poprzez transakcje fragmentów. na przykład ukryj wszystkie fragmenty poprzedniego ekranu i zamiast tego pokaż nowe fragmenty. Muszę przyznać, że ta technika wydaje się nieco dziwna, ponieważ zaleje moją działalność pustymi układami z niewidocznymi fragmentami ... Wygląda na to, że mój cel jest rozsądny, ale nie znalazłem dla niego poprawnego projektu. – DannyA

+0

Cóż, to ciekawy ciąg myśli, ale czy nie jest to dokładnie to, za co zostały wykonane czynności i ich metoda początkowa (intencja)? Odzyskasz również funkcję przycisku wstecz. – user999717

Powiązane problemy