2013-10-18 14 views
37

Buduję układ dla dużych ekranów, który ma składać się z 2 różnych części, lewej i prawej. W tym celu pomyślałem, że użycie 2 fragmentów jest właściwym wyborem.Android: kiedy/dlaczego powinienem używać FrameLayout zamiast Fragment?

Następnie przyjrzałem się przykładowi nawigacji z urządzeniem Master/Detail-Flow. Ma układ 2-okienkowy, z prawej strony - nawigację, a po lewej - widok szczegółów.

Ale w tym przykładzie, różni się od tego, co spodziewałem się zobaczyć na widoku szczegółowym jest FrameLayout które następnie przechowuje Fragment, zamiast Fragment bezpośrednio.

XML układ wygląda następująco (przykład):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginLeft="16dp" 
    android:layout_marginRight="16dp" 
    android:baselineAligned="false" 
    android:divider="?android:attr/dividerHorizontal" 
    android:orientation="horizontal" 
    android:showDividers="middle" 
    tools:context=".WorkStationListActivity" > 

    <fragment 
     android:id="@+id/workstation_list" 
     android:name="de.tuhh.ipmt.ialp.history.WorkStationListFragment" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     tools:layout="@android:layout/list_content" /> 

    <FrameLayout 
     android:id="@+id/workstation_detail_container" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="3" /> 

</LinearLayout> 

Moje pytanie brzmi: dlaczego jest FrameLayout używany zamiast Fragment dla samego widoku szczegółowym? Jaki jest powód lub korzyść? Czy powinienem też tego użyć?

Odpowiedz

36

Pojemnik z detalami to FrameLayout, ponieważ wyświetlany Fragment zostanie zastąpiony przy użyciu metody FragmentTransaction 'replace().

Pierwszy argument dla replace() jest identyfikatorem kontenera, którego Fragmenty zostaną zastąpione. Jeśli FrameLayout w tym przykładzie zostało zastąpione Fragmentem, to zarówno WorkStationListFragment i jakikolwiek Fragment Szczegółowy jest obecnie pokazywany, zostanie zastąpiony przez nowy Fragment. Poprzez enkapsulację Fragmentu w ramach FrameLayout można zastąpić tylko szczegóły.

+0

To naprawdę pomogło. W moim przypadku nie muszę zastępować fragmentu, więc teraz wiem, że mogę opuścić 'FrameLayout' i użyć bezpośrednio' Fragment'. – Terry

2

Dodaj fragment do działania za pomocą <fragment>, jeśli nie potrzebujesz go do reagowania na zmiany w interfejsie użytkownika. W przeciwnym razie użyj opcji <FrameLayout> Układ ramek jest rodzajem grupy widoku, która służy do blokowania obszaru na ekranie.

Powiązane problemy