ActionBar Tab's Fragments blank when switching

2019-08-20 16:44发布

问题:

I am using ActionBar.TabListener as listed here: Action Bar switching tabs automatically:

I am adding a few tabs with tablistener as follows

Tab 1 -> Fragment a -> fragment b -> Fragment c Tab 2-> Fragment d

I click on Tab 1, go from a to b to c. When I stay on Tab 1, and I am in ‘a’, clicking back goes to b, clicking back in b goes to ‘a’ . This is because I have added addtoBackStack() in b and c

But when I am in Fragent ‘c’. and click on Tab 2 and come back to Tab 1 and click back, I get blank white tab.

This seems to be expected because ft.attach() recreates the view according to the documentation.

What I have tried so far: * Used a fragmentTransaction to explicitly add 'a' to backstack in the tablistener's onselected() method.

How can I preserve the view hierarchy in Tab 1 before going to Tab 2 and recreate the hierarchy when back in Tab 1 so that when I am in Tab C, I can go to Tabs B and A?

EDIT: (also added tag fragments to question) I get the following stack trace when pressing back button on Tab 1 after coming from Tab 2

W/System.err(26823): java.lang.IllegalStateException: Fragment already added: SearchTab{427a29a8 #1 id=0x1020002 search}
W/System.err(26823):    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1146)
W/System.err(26823):    at android.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722)
W/System.err(26823):    at android.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1504)
W/System.err(26823):    at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:493)
W/System.err(26823):    at android.app.Activity.onBackPressed(Activity.java:2220)
W/System.err(26823):    at android.app.Activity.onKeyUp(Activity.java:2194)
W/System.err(26823):    at android.view.KeyEvent.dispatch(KeyEvent.java:2782)
W/System.err(26823):    at android.app.Activity.dispatchKeyEvent(Activity.java:2428)
W/System.err(26823):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2076)
W/System.err(26823):    at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:4192)
W/System.err(26823):    at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:4121)
W/System.err(26823):    at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3169)
W/System.err(26823):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(26823):    at android.os.Looper.loop(Looper.java:137)
W/System.err(26823):    at android.app.ActivityThread.main(ActivityThread.java:5328)
W/System.err(26823):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(26823):    at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(26823):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
W/System.err(26823):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
W/System.err(26823):    at dalvik.system.NativeStart.main(Native Method)

回答1:

This was asked a while ago, but you can try implementing your own TabListener and do a FragmentTransation.show() in onTabSelected() and a FragmentTransaction.hide() in onTabUnselected().