Ich habe eine Anwendung, die aus der Verwendung von ActionBarSherlock im Registerkartenmodus besteht. Ich habe 5 Registerkarten und der Inhalt jeder Registerkarte wird mithilfe von Fragmenten behandelt. Für tab2 habe ich jedoch ein Fragment, dessen XML-Datei ein ViewPager-Element enthält, das wiederum einige Fragmentseiten enthält. Wenn ich die Anwendung zum ersten Mal starte, kann ich problemlos zwischen den Registerkarten wechseln. Wenn ich jedoch zum zweiten Mal auf Tab2 drücke, wird der oben genannte Fehler angezeigt. Die Hauptaktivität ist wie folgt:
public class MainActivity extends SherlockFragmentActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getSupportActionBar();
ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
ActionBar.Tab tab3 = actionBar.newTab().setText("Tab3");
ActionBar.Tab tab2 = actionBar.newTab().setText("Tab2");
ActionBar.Tab tab4 = actionBar.newTab().setText("Tab4");
ActionBar.Tab tab5 = actionBar.newTab().setText("Tab5");
Fragment fragment1 = new Tab1();
Fragment fragment3 = new Tab3();
Fragment fragment2 = new Tab2();
Fragment fragment5 = new Tab5();
Fragment fragment4 = new Tab4();
tab1.setTabListener(new MyTabListener(fragment1));
tab3.setTabListener(new MyTabListener(fragment3));
tab2.setTabListener(new MyTabListener(fragment2));
tab5.setTabListener(new MyTabListener(fragment5));
tab4.setTabListener(new MyTabListener(fragment4));
actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3);
actionBar.addTab(tab4);
actionBar.addTab(tab5);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
}
class MyTabListener implements ActionBar.TabListener
{
Fragment fragment;
public MyTabListener(Fragment fragment)
{
this.fragment = fragment;
}
@Override
public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
{
ft.replace(R.id.fragment_container,fragment);
}
@Override
public void onTabUnselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
{
}
@Override
public void onTabReselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
{
}
}
}
Die Fragmentklasse ohne ViewPager lautet wie folgt:
public class Tab1 extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
return inflater.inflate(R.layout.activity_tab1, container, false);
}
}
Die Fragmentklasse mit dem ViewPager lautet wie folgt:
public class Tab2 extends Fragment
{
ViewPager mViewPager;
private MyFragmentPagerAdapter mMyFragmentPagerAdapter;
private static int NUMBER_OF_PAGES = 5;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.activity_tab2, container, false);
return view;
}
@Override
public void onViewCreated(View view,Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());
mViewPager.setAdapter(mMyFragmentPagerAdapter);
}
private static class MyFragmentPagerAdapter extends FragmentPagerAdapter
{
public MyFragmentPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int index)
{
return PageFragment.newInstance("My Message " + index);
}
@Override
public int getCount()
{
return NUMBER_OF_PAGES;
}
}
}
Nach dem, was ich an verschiedenen Stellen gelesen habe (und bitte korrigieren Sie mich, wenn ich falsch liege), geschieht dies, weil der Fragmentmanager beim zweiten Durchgang versucht, die Fragmente aus der nicht mehr vorhandenen Aktivität wiederzuverwenden, wodurch der Fehler ausgegeben wird. Aber ich bin mir nicht sicher, warum dies hier passiert, da ich keine Fragmentaktivität verwende. Laut logcat befindet sich der Fehler in der onViewCreated-Methode der Tab2-Klasse in der Zeile mViewPager.setAdapter (mMyFragmentPagerAdapter). Jede Hilfe wird sehr geschätzt ... Danke.
03-04 12:01:05.468: E/AndroidRuntime(2474): FATAL EXCEPTION: main
03-04 12:01:05.468: E/AndroidRuntime(2474): java.lang.IllegalStateException: Activity has been destroyed
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:433)
03-04 12:01:05.468: E/AndroidRuntime(2474): at com.example.tabs.Tab2.onViewCreated(Tab2.java:31)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.os.Handler.handleCallback(Handler.java:587)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.os.Looper.loop(Looper.java:123)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.app.ActivityThread.main(ActivityThread.java:3687)
03-04 12:01:05.468: E/AndroidRuntime(2474): at java.lang.reflect.Method.invokeNative(Native Method)
03-04 12:01:05.468: E/AndroidRuntime(2474): at java.lang.reflect.Method.invoke(Method.java:507)
03-04 12:01:05.468: E/AndroidRuntime(2474): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
03-04 12:01:05.468: E/AndroidRuntime(2474): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-04 12:01:05.468: E/AndroidRuntime(2474): at dalvik.system.NativeStart.main(Native Method)
quelle
Antworten:
Dies scheint ein Fehler in der neu hinzugefügten Unterstützung für verschachtelte Fragmente zu sein. Grundsätzlich hat das Kind
FragmentManager
einen gebrochenen inneren Zustand, wenn es von der Aktivität getrennt wird. Eine kurzfristige Problemumgehung, die es für mich behoben hat, besteht darin, zuonDetach()
jedem,Fragment
den Sie anrufen, Folgendes hinzuzufügengetChildFragmentManager()
:quelle
Ich habe genau das gleiche Problem. Die einzige Problemumgehung, die ich gefunden habe, besteht darin, die Fragmente bei jedem Ändern der Registerkarten durch eine neue Instanz zu ersetzen.
Keine echte Lösung, aber ich habe keine Möglichkeit gefunden, die vorherige Fragmentinstanz wiederzuverwenden ...
quelle
Beim Aufrufen
super.onCreate()
am Ende meiner Methode ist dasselbe Problem aufgetreten . Der Grund:attachActivity()
wird in onCreate () von FragmentActivity aufgerufen. Beim ÜberschreibenonCreate()
und Erstellen von Registerkarten versucht der Registerkartenmanager, zu einem Fragment zu wechseln, ohne dass die Aktivität an den FragmentManager angehängt ist.Einfache Lösung: Verschieben Sie den Anruf nach
super.onCreate()
an den Kopf des Funktionskörpers.Im Allgemeinen scheint es viele Gründe zu geben, warum dieses Problem auftreten kann. Dies ist nur eine andere ...
Matthias
quelle
Ich wollte hinzufügen, dass mein Problem in einer Aktivität lag, in der ich versucht habe, ein
FragmentTransaction
onCreate zu erstellen, BEVOR ich anriefsuper.onCreate()
. Ich bin geradesuper.onCreate()
an die Spitze der Funktion gewechselt und habe gut funktioniert.quelle
Ich hatte diesen Fehler, weil ich LocalBroadcastManager verwendete und Folgendes tat:
anstatt:
quelle
Ich traf das gleiche Problem und lateron fand heraus , dass ich Anruf verpasst haben ,
super.onCreate( savedInstanceState );
inonCreate()
der FragmentActivity.quelle
Ich habe den gleichen Fehler erhalten, als ich versucht habe, auf das Kind zuzugreifen,
FragmentManager
bevor das Fragment vollständig initialisiert wurde (dh an die Aktivität angehängt oder zumindestonCreateView()
aufgerufen). Andernfalls wird dasFragmentManager
mit einernull
Aktivität initialisiert, die die oben genannte Ausnahme verursacht.quelle
Ich erzwinge das Fragment, das das untergeordnete Fragment enthält, in onPause auf NULL und es behebt mein Problem
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber die vorgeschlagenen Antworten haben an meinem Ende nicht funktioniert. Ich möchte dies hier belassen, nur für den Fall, dass jemand es nützlich findet.
Was ich getan habe ist:
Dann in:
quelle
Ich hatte dieses Problem und konnte hier keine Lösung finden. Daher möchte ich meine Lösung teilen, falls jemand anderes dieses Problem erneut hat.
Ich hatte diesen Code:
und löste das Problem durch Löschen der Zeile "onDestroy ();"
Der Grund, warum ich den ursprünglichen Code geschrieben habe: Ich weiß, dass die Aktivität beim Ausführen von "finish ()" "onDestroy ()" aufruft, aber ich verwende Threads und wollte sicherstellen, dass alle Threads zerstört werden, bevor ich mit der nächsten Aktivität beginne und es sieht so aus, als ob "finish ()" nicht immer unmittelbar ist. Ich muss viel "Bitmap" verarbeiten / reduzieren und große "Bitmaps" anzeigen, und ich arbeite daran, die Nutzung des Speichers in meiner App zu verbessern
Jetzt werde ich die Threads mit einer anderen Methode beenden und diese Methode von "onDestroy ()" ausführen. und wenn ich denke, ich muss alle Fäden töten.
quelle
Ich hatte dieses Problem und realisiert wurde , weil ich rufe
setContentView(int id)
zweimal in meinemActivity
‚sonCreate
quelle
Dieser machte mich verrückt nach Xamarin.
Ich bin darauf mit einer ViewPager-Implementierung für TabLayout INNERHALB eines Fragments gestoßen, das selbst im DrawerLayout implementiert ist:
Sie müssen also den folgenden Code in Ihrem DrawerFragment implementieren . Achten Sie darauf, den richtigen FragmentManager-Pfad zu wählen. Weil Sie möglicherweise zwei verschiedene FragmentManager-Referenzen haben:
-> Wählen Sie die von Ihnen verwendete aus. Wenn Sie den ChildFragmentManager verwenden möchten, müssen Sie die Klassendeklaration Android.App.FragmentManager verwenden für Ihren ViewPager verwenden!
Android.Support.V4.App.FragmentManager
Implementieren Sie die folgende Methode in Ihrem "Haupt" -Fragment - in diesem Beispiel: DrawerFragment
Android.App.FragmentManager
Das heißt, Sie mussten den ViewPager mit Android.App.FragmentManager starten.
Implementieren Sie die folgende Methode in Ihrem "Haupt" -Fragment - in diesem Beispiel: DrawerFragment
quelle
Der Fehler wurde in der neuesten AndroidX-Version behoben. Und die berühmte Problemumgehung wird jetzt zum Absturz führen. also brauchen wir es jetzt nicht.
quelle