30
09-19 12:23:01.084: E/AndroidRuntime(24169): FATAL EXCEPTION: main 
09-19 12:23:01.084: E/AndroidRuntime(24169): Process: com.example.loan, PID: 24169 
09-19 12:23:01.084: E/AndroidRuntime(24169): java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form} 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.handleCallback(Handler.java:733) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.dispatchMessage(Handler.java:95) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Looper.loop(Looper.java:136) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.app.ActivityThread.main(ActivityThread.java:5068) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invokeNative(Native Method) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invoke(Method.java:515) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at dalvik.system.NativeStart.main(Native Method) 

Mam więc aplikację na Androida, która buduje z tabhost. Istnieją trzy karty w sumie w Karta2, jest aby dokonać transakcji fragmentem Karta2 (który jest wywołanie funkcji aktywności fragmentu)IllegalStateException: Fragment już dodany w fragmencie tabhost

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
     t.replace(R.id.realtabcontent, mFrag); 
     t.addToBackStack(null); 
     t.commit(); 

nie jest wyjątkiem jeśli uruchomić tak:

  1. Wewnątrz Karta2, naciśnięciu przycisku, aby fragment
  2. Idź do karty (np. języczek 1 lub karta 3)
  3. Prasa wstecz
  4. wyjątkiem rzutu

Jak to naprawić? Dzięki za pomoc

+0

możliwe duplikat [IllegalStateException: fragment się już pojawia się, gdy APP długo w tle] (http://stackoverflow.com/questions/24629080/illeg alstateexception-fragment-już-dodany-pojawia-się-a-app-był-bardzo-długi-in) – FWeigl

+0

co oznacza, że ​​backpress dodaje nowy fragment, jaka jest logika w backstacku? Wielkie dzięki – user782104

+0

czy mFrag jest dodany do innej zakładki oprócz tab2? – Akhil

Odpowiedz

66

Dzieje się tak, gdy staramy się dodawać sam fragment lub DialogFragment dwukrotnie przed odrzuceniem,

wystarczy zadzwonić pod numer

if(mFragment.isAdded()) 
{ 
    return; //or return false/true, based on where you are calling from 
} 
+3

To powinna być zaakceptowana odpowiedź. Przyjęta odpowiedź nie ma sensu. Po pierwsze, nie powinno być negacji słowa 'isAdded()'. Po drugie, w komentarzach sugeruje się, że ten kod przechodzi w 'onCreate()', co również jest bezsensowne. Ten wiersz kodu powinien zostać umieszczony bezpośrednio przed linią, w której fragment jest dodawany (lub zastępowany), a nie w 'onCreate()' lub 'onCreateView()'. Jest za późno na wykonanie tego kodu w jednej z tych metod. – Alex

+0

'if (fragment.isAdded()) fragmentTransaction.show (fragment);' –

4

Po prostu trzeba sprawdzić jeden warunek w swoim fragmencie wymienionych poniżej:

if(!isAdded()) 
{ 
    return; 
} 

isAdded = Zwraca prawdę, jeśli fragment jest obecnie dodawany do jej działalności. Zaczerpnięte z oficjalnego dokumentu. To nie doda tego fragmentu, jeśli jest już dodane

Sprawdź poniższy link na odniesienie:
http://developer.android.com/reference/android/app/Fragment.html#isAdded()

+0

dziękuję za pomoc, masz na myśli umieszczam if (! IsAdded()) wewnątrz oncreateview? – user782104

+0

Tak, wystarczy umieścić kod, o którym wspomniałem w powyższej odpowiedzi ... Oznacza to, że twój fragment jest już dodany do stosu. Nie trzeba więc dodawać go ponownie i zwraca się po prostu. –

+4

to nie ma sensu, nie możesz zwrócić void w onCreateView, masz na myśli onCreate? próbowałem to tam i to nie pomogło mój problem – Fonix

1

Czasami dzieje się tak, że nie można znaleźć właściwego identyfikatora z odpowiedniego układu. Zmierzyłem się z tym problemem. Potem po wielu godzinach stwierdziłem, że ustawiłem nieprawidłowy identyfikator recyclerview. Zmieniam go i działa dobrze dla mnie.

Sprawdź więc dokładnie układ fragmentów.

+0

Dzięki, to było dla mnie takie samo. Komunikat o wyjątku nie może być bardziej mylący. – SqueezyMo

2

Po prostu trzeba sprawdzić jeden warunek przed transakcją fragmentu początek

if (!fragmentOne.isAdded()){ 
      transaction = manager.beginTransaction(); 
      transaction.add(R.id.group,fragmentOne,"Fragment_One"); 
      transaction.commit(); 
} 

ten pracuje perfactly dla mnie ...

0

Usunąć stary fragment w przypadku, gdy jest jeszcze dodany, a następnie dodać nowy fragment:

FragmentManager fm = getSupportFragmentManager(); 
Fragment oldFragment = fm.findFragmentByTag("fragment_tag"); 
if (oldFragment != null) { 
    fm.beginTransaction().remove(oldFragment).commit(); 
} 
MyFragment newFragment = new MyFragment(); 
fm.beginTransaction().add(newFragment , "fragment_tag");