Dlaczego fragmenty nakładają się, zamiast się zastępować?

0

Chcę się nauczyć jak korzystać z fragmentów (android). Znalazłem na YT jakiś przykład, wg niego robiłem i problem wygląda tak, że odpalam aplikację i klikam w button2, by podmieniło mi domyślny fragment1 na fragment2, ale niestety pod fragment2 widać fragment1 (który robi jakby za tło). Chcę wiedzieć co powoduje ten błąd.

główny xml projektu:

    <fragment
        android:id="@+id/fragment_place"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.example.xyz.test.FragmentOne"
        />

główna klasa (metoda podmieniająca fragmenty):

    public void changeFragment(View view)
    {
        Fragment fragment;

        if (view == findViewById(R.id.button1))
        {
            fragment = new FragmentOne();
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.fragment_place, fragment);
            ft.commit();
        }

        if (view == findViewById(R.id.button2))
        {
            fragment = new FragmentTwo();
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.fragment_place, fragment);
            ft.commit();
        }
    }

Program możecie sobie wyobrazić tak - dwa buttony, a pod nimi fragment. Po włączeniu aplikacji, domyślnie pojawia się FragmentOne. Wciśnięcie button1 powoduje podmienienie tego kontenera fragmentowego na FragmentOne, a button2 robi to samo, ale podmienia na FragmentTwo i tyle.
Nie jestem pewien, ale czy możliwe, że domyślnie wczytywany FragmentOne (bez klikania w buttony) po prostu się nie zamyka i zostaje robiąc za tło?

Bardzo bym prosił kogoś z was o wskazanie mi czego mi brakuje w kodzie, co powoduje ten bug. Próbowałem do metody dla buttonów dopisać:

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);

i podobne kody, ale nic nie dały.
Będę bardzo wdzięczny jeśli ktoś spróbuje mi pomóc. Pozdrawiam.

0

Tagu

<fragment>

używa się tylko w sytuacji, w której nie planujesz podmieniać danego fragmentu. Nie można go również używać we fragmentach zagnieżdżonych.

Zmień layout na:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

i podmieniaj w ten sposób:

 
    Fragment fragment ; // Twój fragment
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
0

fraaaaaaa.jpg

I taki efekt osiągnę? 2 buttony, a pod nimi coś, czego zawartość będzie podmieniana na inne layouty (xml)?

0

Tak, dokładnie taki efekt.
Podmień <fragment> na podany przeze mnie FrameLayout i podmieniaj fragmenty tą metodą, którą podałem.

0

Ja jeszcze zaproponuję Ci, że możesz sobie otworzyć template, który dostarcza google. Template ma nazwę NavigationDrawer i tam w nim jest bardzo dobrze pokazane, jak podmieniać fragmenty za pomocą przycisków (w tym wypadku akurat menu wysuwające się z lewej strony).

0

@kosiarska_ dziękuję za pomoc, działa podmiana, ale pod buttonami zostawiłem ten "mój" kod i działa on, jaka jest różnica w twoim kodzie z tym getSupportFragmentManager? Czym się różni to od Managera bez słówka Support? Bo zakładam, że kod mi zadziała identycznie z twoim kodem, a skoro identycznie, to po co dwie wersje tego bajeru istnieją? Skoro są dwie wersje, to widocznie mają jakąś różnicę gdzieś... więc pytam o nią ;)

0

Różni się tym, że klasy Fragment i FragmentManager (i odpowiadające im mechanizmy) zostały wprowadzone dopiero w api 11 android (wersja 3.0).
Jeżeli chcesz napisać aplikację, która będzie działać na wcześniejszych wersjach androida to musisz użyć metody getSupportFragmentManager z biblioteki support.
http://developer.android.com/tools/support-library/features.html

Istnieje wiele tego typu klas (najczęściej w nazwie mają zwrot Compat albo Support) i metod.
Co do różnic, to tak różnice są, ale głównie wewnętrzne, więc nie musisz się nimi przejmować.

0

aha, dziękuję, cieszę się, że ktoś pomógł mi, jestem wręcz zaskoczony tą pomocą

1 użytkowników online, w tym zalogowanych: 0, gości: 1