Android Fragments recreated on orientation change

梦想与她 提交于 2019-11-30 07:59:29

问题


I'm developing an app that basically has an ActionBar. When my app starts, the Activity creates the fragments and attaches them to each tab, so when I switch I get different views.

The problems arise when I try to rotate the device. After some struggle, I noticed that Android automatically recreates the previously added fragments like this:

SummaryFragment.onCreate(Bundle) line: 79   
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795  
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032  
FragmentManagerImpl.moveToState(int, boolean) line: 1014    
FragmentManagerImpl.dispatchCreate() line: 1761 
DashboardActivity(Activity).onCreate(Bundle) line: 864  
...

and then I recreate the fragments as usual. So I have the "real" fragments that I expect to work correctly and their "hidden" Android-created counterparts that make my app crash. How can I avoid this behavior? I already tried to call setRetainInstance(false) in the SummaryFragment.

Thank you


回答1:


You need to check for a savedInstanceState [edit: in your parent activity], and if it exists, don't create your fragments.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
         // Do your oncreate stuff because there is no bundle   
    }
// Do stuff that needs to be done even if there is a saved instance, or do nothing
}



回答2:


When you create your activity, check to make sure that it doesn't already exist. If it exists, do nothing...Android will recreate it for you.

private void initFragment() {
        FragmentManager fragMgr = getSupportFragmentManager();
        if (fragMgr.findFragmentByTag(LEADERBOARD_FRAG_TAG) != null) { return; }
        frag = new HdrLeaderboardFragment();
        FragmentTransaction ft = fragMgr.beginTransaction();
        ft.replace(R.id.leaderboard_fragment_wrapper, frag, LEADERBOARD_FRAG_TAG);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.commit();
    }



回答3:


If you have the similar ui(no specific layout-land files) for both orientations you can set android:configChanges="keyboardHidden|orientation" to the activity in your manifest file.

If don't provide please the source code where you're adding the fragments to tabs, and I'll try to help you with improvements.




回答4:


I am not sure if there is a better solution, but this is what i did in latest program.

When a fragment is created automatically by system on orientation change and if you want to keep track of them in host activity, catch them in host activity's OnAttachFragment() method. And they get the arguments by default, so you can use them to find out which fragment it is.

   public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);
    if (fragment != null) {
        if(fragment.getArguments() != null) {
            switch (fragment.getArguments().getString(ARG_PARAM1)) {
                case FragmentATag:
                    if (myFragmentA != fragment) {
                        myFragmentA = (FragmentA) fragment;
                    }                     
                    break;
                case FragmentBTag:
                    if (myFragmentB != fragment) {
                        myFragmentB = (FragmentB) fragment;
                    }                        
                    break;                  
            }
        }
     }
   }


来源:https://stackoverflow.com/questions/10634854/android-fragments-recreated-on-orientation-change

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!