片段中的SavedInstanceState始终为null

Tom*_*ary 33 android bundle fragment

我有一个使用XML(活动中的setContentView())附加到活动的片段.有一个问题,因为我的片段中有非常动态的视图,因此当方向更改时,我必须恢复所有视图状态.

我有问题,因为我正在使用类似的东西:

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

但是在方向更改后调用param Bundle savedInstanceState的方法时(如onCreateView等),我的savedInstanceState始终为null.

我不是Android中的菜鸟,但现在因为这个问题我很生气...

public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    if (savedInstanceState == null) {
        //smth
    } else {
        // smthelse THIS IS NEVER REACHED BECAUSE BUNDLE IS ALWAYS NULL
    }

    getListView().setDivider(getResources().getDrawable(R.drawable.list_divider));
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ary 62

所有问题都在于我没有为XML中的片段声明android:id.Android需要ID或TAG来识别存储的片段并重现其中的所有元素.所以,请记住 - 片段的每个实例都需要唯一的ID或标签!

此外,当声明setRetainInstance(true)时,bundle应始终返回null.

  • 我在`onCreate()`中有'setRetainInstance(true)` - 偷偷摸摸的小混蛋...... (19认同)
  • 谢谢.但是动态添加的片段(与FragmentManager事务一起添加)呢?我发现的唯一方法是将状态存储在Fragment的参数中...... (12认同)
  • 你能说明代码的外观吗?不确定将xml ID挂钩到片段活动的方式/位置. (8认同)
  • 回答关于以编程方式/动态添加片段的@babay问题,我遇到了同样的问题:每次我尝试恢复标准的savedInstanceState时,它总是为空.原因是因为我使用的是popBackStack,所以onSaveInstanceState方法永远不会被调用,因为它在onDestroy之后,而不是在onDestroyView之后,所以因为这个原因,片段中的savedInstanceState始终为null.所以解决方案很简单:创建一个私有Bundle,你可以在onPause中保存View的状态,然后在onCreateView中恢复它. (4认同)
  • 你能澄清一下如何在xml中指定片段id. (2认同)
  • @babay:很简单:<fragment android:id ="@ + id/your_id"... /> (2认同)
  • 当我通过ViewPager使用Fragment时,如何处理这个问题 (2认同)

小智 6

我有一个类似的问题,尽管我总是向Fragment提供捆绑包,但总是将saveInstanceState设置为null。

对我有用的唯一解决方案是

myFragment.setArguments(bundle) 
Run Code Online (Sandbox Code Playgroud)

和我的活动包一起做

Bundle bundle = this.getArguments();
Run Code Online (Sandbox Code Playgroud)

在片段的onCreateView中。

希望这对其他人有帮助。

  • WTF,如果u从活动中设置参数,则saveInstanceState将始终返回null。活动捆绑包与savedInstanceState捆绑包无关。 (5认同)