2015-09-29 24 views
5

MainActivity có một FragmentTabHost trong đó và năm Fragments thêm vào FragmentTabHost này. Đây là mã initjava.lang.IllegalStateException: Không thể thực hiện hành động này sau khi 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); 
     ...... 
} 

Và tôi đã đọc article này, hãy tìm không FragmentTransaction # cam kết() trong mã của tôi.

Và tôi đã cố gắng không gọi super.onSaveInstanceState (Bundle outState) trong Activity.onSaveInstanceState tôi (outState)

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

Dưới đây là các bản ghi tai nạn

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

Mã trên có được thực hiện từ bên trong onCreate() hoạt động của bạn không? Bạn có gọi setup() không? – logcat

+0

tôi quên dán nó vào mã của tôi, mTabHost.setup (điều này, mFragmentManager, android.R.id.tabcontent); – Scorpiuszjj

+0

Tôi nhận được cùng một vấn đề. Bạn có nhận được giải pháp nào không? – MobileAppDeveloper

Trả lời

3

The onSaveInstanceState m ethod được gọi trước khi Activity sắp bị phá hủy, để lưu dữ liệu Activity. Nó gây ra lỗi để thêm Fragment vào nó sau khi dữ liệu được lưu. Giải pháp là thay thế phương thức commit() bằng commitAllowingStateLoss() và hiệu ứng là giống nhau.

+0

nhưng, không có FragmentTransaction # commit() trong mã của tôi. – Scorpiuszjj

+0

Bạn có thể từ bỏ sử dụng FragmentTabHost , thay vì phương thức khác, giống như câu trả lời mới của tôi. – John

+0

Tôi chỉ đang cố gắng tìm ra điều này, không chỉ đơn giản là thử thực hiện khác. – Scorpiuszjj

-1

Sử dụng Framelayout:

<FrameLayout 

      android:id="@+id/tab_content" 

      android:layout_width="match_parent" 

      android:layout_height="match_parent" 

      android:layout_gravity="bottom" 

      android:orientation="vertical" /> 

và thêm một phương pháp:

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; 

    } 

sau đó bạn có thể sử dụng phương pháp commitAllowingStateLoss().

Các vấn đề liên quan