2013-06-26 34 views
5

Myślałem, że zrozumiałem, że powinieneś wywołać FragmentTransaction.add() w onCreate() i FragmentTransaction.remove() w onDestroy(). Moi awarii aplikacji w onDestroy() z tego błędu:Android: Kiedy należy używać FragmentTransaction.remove?

06-26 15:25:50.213: E/AndroidRuntime(579): java.lang.RuntimeException: Unable to destroy activity {com.myapp/com.myapp.MainActivity}: java.lang.IllegalStateException: Activity has been destroyed 

Kiedy mogę nazwać te rzeczy, jeśli nie w onCreate/onDestroy()?

+3

Nie musisz ręcznie niszczyć swoich fragmentów, gdy działanie jest niszczone - jest ono zarządzane przez strukturę fragmentów. – CommonsWare

+0

OK. Czytałem to podczas wyszukiwania w Internecie rozwiązań. Mój problem polega na tym, że kiedy przełączam się na mój widok poziomy, a następnie z powrotem do mojego widoku pionowego, mam teraz duplikat układu co najmniej jednego zagnieżdżonego fragmentu. Jest jeden układ tego fragmentu na górze, który nie pobiera aktualizacji z setText, a następnie kolejna kopia tego układu tuż pod nim, która pobiera aktualizacje z setText. – KairisCharm

Odpowiedz

3

My problem with that is that when I switch to my horizontal view, and then back to my vertical view, I now have a duplicate layout for at least one of the nested fragments.

Domyślam się, że to dlatego, że jesteś zawsze dodanie fragmentu w onCreate(). Android automatycznie odtwarza fragmenty po zmianach konfiguracji. Stąd onCreate() należy sprawdzić, czy fragment istnieje już przed dodaniem go:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (getSupportFragmentManager().findFragmentById(android.R.id.content)==null) { 
     getSupportFragmentManager().beginTransaction() 
           .add(android.R.id.content, 
             new RotationFragment()).commit(); 
    } 
    } 
+0

Prawdopodobnie masz rację. Ale gdy wykonuję if (getChildFragmentManager(). FindFragmentByTag ("MyFrag") == null) Zawsze otrzymuję zwrot wartości true. – KairisCharm

2

Ok, rozwiązanie działało, z wyjątkiem zamiast używać:

if (getSupportFragmentManager().findFragmentById(android.R.id.content)==null) 

użyłem:

if (savedInstanceState==null) 

Najwyraźniej menedżer fragmentów nie jest skonfigurowany przez funkcję onCreate. Ale ponieważ twoja odpowiedź jest w większości poprawna, zaznaczam ją jako odpowiedź.

Chcę jeszcze raz podziękować. Po raz drugi okazałeś mi wielką pomoc i naprawdę to doceniam.

Powiązane problemy