wake-up-neo.com

Fragment hat bereits IllegalStateException hinzugefügt

Ich verwende diese Methode für meine Containeraktivität, um ein BFrag anzuzeigen

public void showBFrag()
{
    // Start a new FragmentTransaction
    FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();

    if(mBFrag.isAdded())
    {
        Log.d(LOG_TAG, "Show() BFrag");
        fragmentTransaction.show(mBFrag);   
    }
    else
    {
        Log.d(LOG_TAG, "Replacing AFrag -> BFrag");
        fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);
    }

    // Keep the transaction in the back stack so it will be reversed when backbutton is pressed
    fragmentTransaction.addToBackStack(null);

    // Commit transaction
    fragmentTransaction.commit();        
}

Ich nenne es aus meinem Container Activity; zum ersten Mal: 

  • geht in die else-Anweisung und mBFrag ersetzt mAFrag. 

Dann drücke ich die Zurück-Taste:

  • und der Vorgang wird umgekehrt (mAFrag wird angezeigt, aber ... wird mBFrag entfernt?). 

Dann gehe ich weiter, indem ich showBFrag () von derselben Aktivität aus aufrufe: 

  • und es kommt wieder in die else-Anweisung. (so kann ich ableiten, dass mBFrag NICHT hinzugefügt ist)
  • aber ich habe ein Fragment bereits hinzugefügt IllegalStateException ... (warum kam es dann nicht in die if-Anweisung?)

So:

  1. Warum gibt die isAdded () - Methode nicht TRUE zurück, wenn ein Fragment bereits mit IllegalStateException ?? angezeigt wird? 
  2. Entfernt der popBackStack-Vorgang zuvor hinzugefügte Fragmente vollständig?
  3. Welches Verhalten missverstehe ich? 

BEARBEITEN: Hier sind die vollständigen Informationen der Ausnahme.

06-07 12:08:32.730: ERROR/AndroidRuntime(8576): Java.lang.IllegalStateException: Fragment already added: BFrag{40b28158 id=0x7f0c0085}
06-07 12:08:32.730: ERROR/AndroidRuntime(8576):     at Android.app.BackStackRecord.doAddOp(BackStackRecord.Java:322)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576):     at Android.app.BackStackRecord.replace(BackStackRecord.Java:360)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576):     at Android.app.BackStackRecord.replace(BackStackRecord.Java:352)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576):     at myPackageName.containerActivity.showBFrag() // This line: "fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);"
51
Axel M. Garcia

Schließlich bestand mein Workaround darin, remove () des vorherigen Fragments auszuführen und das neue hinzuzufügen (). Obwohl dies die Methode replace () ist sollte dies tun ...

Aber ich schätze immer noch, warum die replace () - Methode in diesem Fall nicht gut funktioniert hat ... ist wirklich komisch und ich möchte verwerfen, dass ich etwas missverstehe oder etwas falsch mache.

41
Axel M. Garcia

Wenn der Status der Aktivität bereits gespeichert wurde, ist das Festschreiben nicht mehr sicher. Sie müssen stattdessen commitAllowingStateLoss() aufrufen. Hoffe das hilft!

Edit: ok Ich habe mir Ihr Problem genauer angesehen. Das Problem ist, dass Sie versuchen, ein bereits hinzugefügtes Fragment hinzuzufügen. Selbst wenn Sie Anrufe ersetzen oder entfernen, können Sie dies nicht tun. Die einzige Lösung, die ich gefunden habe, ist, eine neue Instanz eines Fragments zu erstellen und es jedes Mal hinzuzufügen. Wenn Sie ein Fragment entfernt oder ersetzt haben, sollten Sie am besten alle Referenzen darauf löschen, damit der GC sich darum kümmern kann.

12
schwiz

Wahrscheinlich nicht direkt mit diesem Problem verbunden, aber ich habe auch festgestellt, dass das Festlegen eines Übergangs zu FragmentTransaction eine IllegalStateException verursacht, das Festlegen eines Übergangs jedoch nicht.

Hier ist der Fehler für dieses Problem: http://code.google.com/p/Android/issues/detail?id=25598

8
Johan Paul

Prüfen Sie, ob das Frament bereits mit der Methode fragment.isAdded () hinzugefügt wurde oder nicht. Ersetzen oder fügen Sie das Fragment entsprechend hinzu

1

Ich habe das benutzt:

if (getFragmentManager().findFragmentByTag(newFragment.getClass().getName()) != null) {
   transaction.remove(newFragment);
 }

und hinzugefügtes Fragment mit

MyFragment frag = new MyFragment(); 
transaction.add(R.id.container, frag, MyFragment.class.getName())

MyFragment.class.getName() steht für tag

1
Nartus Team

versuche dies nach fragmentTransection.replace ()

fragmentTransection.addToBackStack(null);
fragmentTransection.commitAllowingStateLoss();
1
Saleh Sheper

if (mFragment.isAdded ()) { Rückkehr; // oder geben Sie false/true zurück, je nachdem, von wo aus Sie anrufen }

0
Bombey77

Dieser Code funktioniert gut für mich. Versuche dies

((MiActivity)getActivity()).addAccount = new AddAccount();
((MiActivity)getActivity()).addAccount.setArguments(params);
fragmentManager = getActivity().getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container((MiActivity)getActivity()).addAccount);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
0

Das Entfernen von setOffscreenPageLimit aus Viewpager hat mein Problem gelöst . Danke.

Gelöst wurde es, indem ich durch meine Fragmente ging und überprüfe, ob isAdded () true ist, und dann dieses Fragment entferne. Weitere Details hier.

0
kylarsturn

Ich habe versucht, FragmentTransaction.remove() von onTabUnselected() aufzurufen, und es wurde dieser Fehler behoben.

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    ft.add(R.id.fragment_container, fragment, null);
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    ft.remove(fragment);
}
0
ObviousChild