2012-02-20 8 views
6

Ta aplikacja jest ćwiczeniem edukacyjnym dla mnie, używając fragmentów, między innymi. Ma jedną aktywność, która zarządza kilkoma różnymi fragmentami. Pierwszym z nich jest ListFragment (A), który pokazuje, kiedy aplikacja się uruchamia i ładuje elementy listy z kursora. Kliknięcie elementu listy powiadamia działanie, które ma zastąpić ListFragment za pomocą funkcji DetailFragment (B) dla tego elementu. Jeśli patrząc na (B) obrócić ekran, widzę (B) na górze (A), tak:Fragmenty Androida nakładające się po obróceniu ekranu

http://postimage.org/image/uhy016ds7/

Mój najlepszy przypuszczenie to, że ma do czynienia ze zniszczeniem Android i ponownie tworzenie działania na zmianę konfiguracji. Zastanawiam się, jakie jest najczystsze rozwiązanie tego problemu. Poniżej znajdują się fragmenty kodu, daj mi znać, jeśli jest jeszcze coś, co powinienem opublikować.

res/layout/home.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/fragment_place_list" 
     android:name="com.simbiosys.apps.foodfast.ui.PlaceListFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </fragment> 
</FrameLayout> 

MyActivity.onCreate

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    placeListFragment = (PlaceListFragment) getSupportFragmentManager().findFragmentById(
      R.id.fragment_place_list); 

} 

MyActivity.showDetailPane

public void showDetailPane(String id, String reference) { 
    placeDetailFragment = PlaceDetailFragment.newInstance(id, reference); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.addToBackStack(null); 
    ft.hide(placeListFragment); 
    ft.replace(R.id.fragment_container, placeDetailFragment); 
    ft.show(placeDetailFragment); 
    ft.commit(); 
} 
+0

czy sprawdziłeś "zasoby alternatywne"? http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources –

+0

Cóż, skupiam się na ekranach telefonów w tej chwili.Układ listy ListFragment i tak nie byłby inny w krajobrazie. W rzeczywistości nie ma układu xml dla ListFragment, ponieważ wszystko, co aktualnie ma, to wbudowany ListView. – Karakuri

Odpowiedz

4

Jest tak dlatego, że używasz układu ramek jako kontenera. Nie zachodzi na siebie w przypadku innych układów.

Aby uzyskać najlepszą praktykę, należy utworzyć plik XML w swoim układzie/folderze, w którym używany jest tylko element listfragment. W swoim layoucie-land/umieścisz plik XML z użyciem obu fragmentów używanych i ułożonych.

Następnie system obsługuje cały proces tworzenia. paprochy. A twoja aktywność ogranicza się do wywołania setContentView().

Na pozycji listy kliknij, a następnie sprawdź w menedżerze fragmentów, czy fragment Twojego detalu został utworzony, czy nie. Jeśli został utworzony, wywołujesz funkcję publiczną w obrębie fragmentu szczegółów, aby ustawić dane.

Jeśli nie jest utworzony, tworzy się intencję z nową aktywnością.

Znam 2 dobre samouczki: strona fragmentów na stronie dla programistów Androida i vogella.de oba podadzą szczegółowy przykład/samouczek.

+0

Dzięki za wskazanie, że był to FrameLayout. Staram się jednak nie uruchamiać kolejnej czynności, ponieważ wykonuje ona inne czynności za kulisami. Powiedział, że dałeś mi jeden lub dwa pomysły do ​​pracy, więc dzięki. – Karakuri

2

To działa dla mnie.

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    .... 
    fragment = getFragmentManager().findFragmentByTag(TAG); 
    if(fragment == null) fragment = new Fragment(); 
    .... 

} 
3

Zmień FrameLayout dla LinerLayout, a problem zostanie rozwiązany.

To jest związany z FrameLayout problem.

+1

To działało dla mnie bez zmiany mojej architektury. – BeccaP

5

Zgodnie z Androidem dev page w metodzie onCreate Activity należy sprawdzić, czy zapisana wartośćInstanceState ma wartość NULL przed dodaniem fragmentu do działania. Fragment kodu metody onCreate Activity z this page stwierdza, że.

// However, if we're being restored from a previous state, 
// then we don't need to do anything and should return or else 
// we could end up with overlapping fragments. 
if (savedInstanceState != null) { 
    return; 
} 
+0

Dzięki, działa idealnie, uratował mnie po 2 godzinach zmagań z nim – Mal

+0

proste i działało. – iCrus

Powiązane problemy