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) 

Quindi, ho un'app per Android che crea con il tabhost. Ci sono tre schede in totale, nel Tab2, c'è un pulsante per effettuare la transazione frammento tab2 (che chiama la funzione nell'attività frammento)IllegalStateException: Frammento già aggiunto nel frammento tabhost

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

C'è un'eccezione se corro in questo modo:

  1. All'interno tab2, si preme il pulsante per cambiare frammento
  2. Vai un'altra scheda (es. tab 1 o scheda 3)
  3. Premere il tasto posteriore
  4. eccezione tiro

Come risolvere quello? Grazie per l'aiuto

+0

possibile duplicato di [IllegalStateException: frammento già aggiunto appare se un app è stato molto lungo in background] (http://stackoverflow.com/questions/24629080/illeg alstateexception-fragment-already-added-compare-if-a-app-was-very-long-in) – FWeigl

+0

significa che il backpress sta aggiungendo un nuovo frammento, qual è la logica nel backstack? Grazie mille – user782104

+0

mFrag è stato aggiunto a qualche altra scheda oltre alla tab2? – Akhil

risposta

66

questo accade quando si cerca di aggiungere stesso frammento o DialogFragment due volte prima di congedare,

basta chiamare il

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

Questa dovrebbe essere la risposta accettata. La risposta accettata non ha senso. Innanzitutto, non dovrebbe esserci negazione di 'isAdded()'. Secondo, nei commenti, si suggerisce che questo codice vada in 'onCreate()', che è anche privo di senso. Questa riga di codice deve essere posizionata direttamente prima della riga in cui il frammento viene aggiunto (o sostituito), non in "onCreate()" o "onCreateView()". È troppo tardi per eseguire quel codice in uno di questi metodi. – Alex

+0

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

4

Basta controllare una condizione nel vostro frammento di seguito indicate:

if(!isAdded()) 
{ 
    return; 
} 

isAdded = Restituisce vero se il frammento è attualmente aggiunto alla sua attività. Tratto dal documento ufficiale. Questo non aggiungerà quel frammento se è già aggiunto

controllano sotto il collegamento per un riferimento:
http://developer.android.com/reference/android/app/Fragment.html#isAdded()

+0

grazie per il tuo aiuto, vuoi dire che ho inserito if (! IsAdded()) all'interno di oncreateview? – user782104

+0

Sì, devi solo inserire il codice che ho menzionato nella mia risposta sopra ... Significa che il tuo frammento è già stato aggiunto nello stack. Quindi, non c'è bisogno di aggiungerlo di nuovo e ritorna semplicemente. –

+4

questo non ha senso, non puoi restituire nulla in onCreateView, intendevi onCreate? ho provato questo in là e non ha aiutato il mio problema – Fonix

1

A volte capita di non trovare l'id corretto dal rispettivo layout. Ho affrontato questo problema. Poi, dopo molte ore ho scoperto che ho impostato l'ID di recyclerview sbagliato. Lo cambio, e funziona bene per me.

Quindi, ricontrolla il layout del frammento.

+0

Grazie, è stato lo stesso per me. Il messaggio di eccezione non potrebbe essere più fuorviante. – SqueezyMo

2

Non vi resta che verificare una condizione prima di un'operazione frammento dell'inizio

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

questo sta lavorando perfactly per me ...

0

Rimuovere il vecchio frammento nel caso sia ancora aggiunto e quindi aggiungere il nuovo frammento:

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");