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:
Dann drücke ich die Zurück-Taste:
Dann gehe ich weiter, indem ich showBFrag () von derselben Aktivität aus aufrufe:
So:
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);"
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.
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.
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
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
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
versuche dies nach fragmentTransection.replace ()
fragmentTransection.addToBackStack(null);
fragmentTransection.commitAllowingStateLoss();
if (mFragment.isAdded ()) { Rückkehr; // oder geben Sie false/true zurück, je nachdem, von wo aus Sie anrufen }
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();
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.
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);
}