SavedInstanceState is always null in fragment

后端 未结 5 1857
隐瞒了意图╮
隐瞒了意图╮ 2020-11-30 04:08

I have a fragment attached to the activity using XML (and setContentView() in activity). A have a problem because I have very dynamic views in my fragment, so when orientati

相关标签:
5条回答
  • 2020-11-30 04:25

    Ok I know this is an old post but I couldn't find the right answer for me here nor many other places, so I am posting how I fixed my case.

    So My Fragment is inside an Activity. And I originally tried to save Bundle only in Fragment and retrieve it at onCreateView. However that was the problem.

    I fixed this by initiating myFragment object in activity and put that object to activity Bundle at onSaveInstanceState(). Then retrieved it at onRestoreInstanceState(). I used getSupportFragmentManager().putFragment/getFragment. Then the savedInstanceState in fragment was no longer null.

    0 讨论(0)
  • 2020-11-30 04:28

    For Fragment :-

    use this for save state of fragment on orientation.
    
    onCreate(Bundle save)
    {
       super.onCreate(save);
       setRetainInstance(true);
    }
    

    See this tutorial :- http://techbandhu.wordpress.com/2013/07/02/android-headless-fragment/

    For Activity:-

    When you start your application, in onCreate, your bundle object is null, so you have to put a check like below and when you rotate your screen then onSaveInstance is called and your bundle object is initialized

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
    
        if (savedInstanceState != null) {
             boolean t = outState.getBoolean("restore"); 
             int s = outState.getInt("nAndroids");
        }
    }
    
    0 讨论(0)
  • 2020-11-30 04:31

    I had a similar problem where I was always getting savedInstanceState as null inspite of supplying the bundle to the Fragment.

    The only solution that worked for me was to do

    myFragment.setArguments(bundle) 
    

    with my bundle from the Activity and do a

    Bundle bundle = this.getArguments();
    

    in onCreateView of the fragment.

    Hope this helps someone else.

    0 讨论(0)
  • 2020-11-30 04:39

    All the problem was in that I don't declare android:id for the fragment in XML. Android needs ID or TAG to recognize stored fragment and reproduce all elements in it. So guys, remember - every instance of fragment needs unique id or tag!

    Also, when setRetainInstance(true) is declared then bundle should always return null.

    0 讨论(0)
  • 2020-11-30 04:41

    First you should put your data, then call super.onSaveInstanceState(outState);

    public void onSaveInstanceState(Bundle outState) {
    
        outState.putBoolean("restore", true);
        outState.putInt("nAndroids", 2);
        super.onSaveInstanceState(outState);
    }
    

    And be sure that activity has not nohistory property in AndroidManifest.xml or set it to false.

            <activity
            android:noHistory="false">
    
    0 讨论(0)
提交回复
热议问题