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.
To powinien być komentarz niż odpowiedź. –
nie, nie jest to również odpowiednia odpowiedź. – Zyoo
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