2015-09-29 7 views
5

MainActivity keine FragmentTabHost und fünf Fragmente zu diesem FragmentTabHost hinzugefügt werden. Hier ist die init-Codejava.lang.IllegalStateException: Diese Aktion kann nach onSaveInstanceState, FragmentTabHost

protected void onCreate(Bundle savedInstanceState) { 
     mFragmentManager = getSupportFragmentManager(); 
     mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, mFragmentManager, android.R.id.tabcontent); 
     // Home 
     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_TAG_HOME).setIndicator(
         newTabItem(R.drawable.mi_selector_tab_home, 
           R.string.mi_tab_item_milian)), 
       TabFateFragment.class, null); 

     // Serach 
     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_TAG_SEARCH).setIndicator(
         newTabItem(R.drawable.mi_selector_tab_search, 
           R.string.mi_navi_title_search)), 
       TabSearchFragment.class, null); 

     // Msg 
     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_TAG_MSG).setIndicator(
         newTabItem(R.drawable.mi_selector_tab_msg, 
           R.string.mi_navi_title_msg)), 
       TabMsgFragment.class, null); 

     // Nearby 
     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_TAG_NEARBY).setIndicator(
         newTabItem(R.drawable.mi_selector_tab_nearby, 
           R.string.mi_navi_title_nearby)), 
       TabNearbyFragment.class, null); 

     // Me 
     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_TAG_ME).setIndicator(
         newTabItem(R.drawable.mi_selector_tab_me, 
           R.string.mi_navi_title_me)), 
       TabMeFragment.class, null); 
     ...... 
} 

Und ich diese article gelesen haben, finden keine FragmentTransaction #() in meinem Code zu begehen.

Und ich habe versucht, nicht super.onSaveInstanceState (Bundle outstate) in meinem Activity.onSaveInstanceState (outstate)

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     // super.onSaveInstanceState(outState); 
    } 

Hier ist der Crashlog

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source) 
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(Unknown Source) 
    at android.support.v4.app.BackStackRecord.commitInternal(Unknown Source) 
    at android.support.v4.app.BackStackRecord.commit(Unknown Source) 
    at android.support.v4.app.FragmentTabHost.onAttachedToWindow(Unknown Source) 
    at android.view.View.dispatchAttachedToWindow(View.java:12134) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2453) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) 
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2460) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1207) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5483) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:778) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
    at android.view.Choreographer.doFrame(Choreographer.java:561) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:764) 
    at android.os.Handler.handleCallback(Handler.java:730) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5109) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

Wird der obige Code von onCreate() Ihrer Aktivität ausgeführt? Rufen Sie Setup() auf? – logcat

+0

Ich habe vergessen, es in meinen Code, mTabHost.setup einfügen (dies, mFragmentManager, android.R.id.tabcontent); – Scorpiuszjj

+0

Ich bekomme das gleiche Problem. Hast du irgendeine Lösung gefunden? – MobileAppDeveloper

Antwort

3

Der onSaveInstanceState m ethod wird aufgerufen, bevor die Aktivität zerstört wird, um die Aktivitätsdaten zu speichern.Es wird ein Fehler erzeugt, dem Fragment nach dem Speichern der Daten ein Fragment hinzuzufügen.Die Lösung besteht darin, die Methode commit() durch commitAllowingStateLoss() und den Effekt zu ersetzen ist dasselbe.

+0

, aber es gibt keine FragmentTransaction # commit() in meinem Code. – Scorpiuszjj

+0

Sie können die Verwendung von FragmentTabHost anstelle einer anderen Methode aufgeben, genau wie meine neue Antwort. – John

+0

Ich versuche nur, das herauszufinden, nicht einfach eine andere Implementierung zu versuchen. – Scorpiuszjj

-1

Framelayout Verwendung:

<FrameLayout 

      android:id="@+id/tab_content" 

      android:layout_width="match_parent" 

      android:layout_height="match_parent" 

      android:layout_gravity="bottom" 

      android:orientation="vertical" /> 

und ein Verfahren hinzufügen:

private synchronized void replaceFragment() { 



     FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 

     // Workaround for Issue 42601: 

     // https://code.google.com/p/android/issues/detail?id=42601 

     fragmentTransaction.detach(tabFragments[previousTabIdx]).replace(R.id.tab_content, tabFragments[curTabIdx]) 

       .attach(tabFragments[curTabIdx]).commitAllowingStateLoss(); 

     previousTabIdx = curTabIdx; 

    } 

dann können Sie commitAllowingStateLoss() -Methode.

Verwandte Themen