2013-05-19 11 views
9

Kiedy zacznę moją aplikację to prowadzi AsyncTask załadować, a następnie w onPostExecute, ja wtedy setContentView do nowego układu następnie dodać fragment z dwoma przyciskami oferują dwa tryby przez add FragmentTransaction. Po kliknięciu jednego z dwóch trybów, zastępuje on ten fragment jeszcze jednym FragmentTransaction za pomocą metody zamiany.Zastąpiony fragment nadal widoczny

Jeśli aplikacja ulegnie awarii, powraca do pierwszego ekranu, ładując dwa przyciski oferujące dwa tryby. W takim przypadku, jeśli wybrano któryś z trybów, załadowany jest drugi fragment, ale teraz tło jest nagle przezroczyste, pokazując dwa przyciski poniżej i pozostają one klikalne. Jeśli zostaną one kliknięte ponownie, poprawnie zamieniają fragment, aby nie był widoczny poniżej. To jest po prostu dziwne, nie mogę zrozumieć, co mogło to spowodować.

Sprawdziłem i widziałem te dwa podobne pytania, one i two, które sugerowały, że może to być spowodowane tym, że identyfikator jest nieprawidłowy lub zdefiniowałem fragment w XML. Żadne z tych dwóch czynników nie ma miejsca.

Mój kod jest wyświetlany poniżej:

Poniżej zastępuję ekran ładowania.

@Override 
    protected void onPostExecute(Void result) { 
     setContentView(R.layout.activity_main_screen); 
     FragmentTransaction transaction = getSupportFragmentManager() 
       .beginTransaction(); 
     transaction.add(R.id.fragment_container, new ModeFragment()) 
       .commit(); 
      } 

Po czym, po kliknięciu przycisku mijam fragment pragnę zastąpić obecny ze w tej metodzie poniżej:

private void replaceCurrentFragment(Fragment fragment) { 
    FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment) 
      .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
      .addToBackStack(null).commit(); 
} 

Działa to po raz pierwszy, jednak jeśli awaria następnie aplikacja powraca do pierwszego fragmentu i po raz drugi ta metoda jest przekazywana, nowy zastępujący fragment jest częściowo niewidoczny. Kliknięcie przycisku na pierwszym fragmencie ponownie wywołuje tę metodę ponownie i jest teraz w porządku.

Oczywiście nie chcę, aby aplikacja się zawiesiła, więc to nie powinno się zdarzyć, ale mam wrażenie, że coś jest nie tak z tym, jak piszę swój kod.

Odpowiedz

11

Miałem ten sam problem, który przydarzył mi się, i to dlatego, że wczytałem fragment w OnCreate mojej Aktywności, bez sprawdzania, czy istnieje zapisana Stan Substancji, więc Android najpierw ponownie otworzył wszystkie stare fragmenty, a następnie wykonaj procedurę OnCreate , który dodał fragment nad starymi bez zastępowania ich, więc kiedy przejdziesz do innego fragmentu, zastępuje on tylko górny, ale nie dolny, więc zobaczysz pod nim fragmenty.

Może nie jest to dokładnie to samo dla ciebie, ale może ci to pomóc.

+1

To powinien być komentarz niż odpowiedź. –

+7

nie, nie jest to również odpowiednia odpowiedź. – Zyoo

+0

Mój problem dotyczył atrybutu tła w elemencie HoloGraph (mała biblioteka do rysowania wykresów) w pliku układu XML podsumowania. Usunąłem ten atrybut i zadziałało. Zastąpiłem mój fragment po odłączeniu, aby odświeżyć fragment, ale rzeczywiście nie musiałem go zastępować, wystarczyło odłączyć, dołączyć (wywołuje fragment onCreateView) i zatwierdzić. Jeśli masz podobny problem i musisz przekazać dane do fragmentu, sugeruję zmianę, w której przechowujesz dane z pakietu fragmentów do niektórych pól w innej klasie. Uzyskaj do nich dostęp w onCreateView fragmentu. – Metallica

Powiązane problemy