片段中的SavedInstanceState始终为null

时间:2013-12-12 17:21:42

标签: android fragment bundle

我有一个使用XML(活动中的setContentView())附加到活动的片段。有一个问题,因为我的片段中有非常动态的视图,所以当方向发生变化时 我必须恢复所有观点状态。

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

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

但是在方向更改后调用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));
}

6 个答案:

答案 0 :(得分:61)

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

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

答案 1 :(得分:5)

我有一个类似的问题,我总是将savedInstanceState作为null,尽管将包提供给片段。

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

myFragment.setArguments(bundle) 

使用我的活动包并执行

Bundle bundle = this.getArguments();

在片段的onCreateView中。

希望这有助于其他人。

答案 2 :(得分:2)

对于片段: -

use this for save state of fragment on orientation.

onCreate(Bundle save)
{
   super.onCreate(save);
   setRetainInstance(true);
}

参见本教程: - http://techbandhu.wordpress.com/2013/07/02/android-headless-fragment/

活动: -

当您启动应用程序时,在onCreate中,您的包对象为空,因此您必须进行如下所示的检查,当您旋转屏幕时,将调用onSaveInstance并且您的包对象是初始化

    @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");
    }
}

答案 3 :(得分:1)

首先,您应该放置数据,然后调用ip nat inside source list 1 interface g0/0 overload ip nat inside source static tcp 192.168.0.10 80 123.123.123.4 80 ip nat inside source static tcp 192.168.0.10 443 123.123.123.4 443

super.onSaveInstanceState(outState);

确保活动在public void onSaveInstanceState(Bundle outState) { outState.putBoolean("restore", true); outState.putInt("nAndroids", 2); super.onSaveInstanceState(outState); } 中没有nohistory属性或将其设置为 false

AndroidManifest.xml

答案 4 :(得分:0)

好的,我知道这是一篇很老的帖子,但我在这里找不到合适的答案,也没有其他地方,所以我发帖告诉我如何解决我的问题。

所以我的片段在一个活动中。我最初尝试仅在Fragment中保存Bundle并在onCreateView中检索它。不过那就是问题所在。

我通过在activity中启动myFragment对象并将该对象放在onSaveInstanceState()的活动Bundle中来修复此问题。然后在onRestoreInstanceState()中检索它。我使用了getSupportFragmentManager()。putFragment / getFragment。然后片段中的savedInstanceState不再为空。

答案 5 :(得分:0)

如果您尝试使用outState保存状态并通过导航到另一个片段来破坏该片段,则它将无法正常工作,在这种情况下,您必须将状态永久保存在sharedPreferences中,或者如果它很大,并且您想要更有条理,您可以使用任何持久性库,例如Room,Realm等。

例如,何时仅应使用outState和savedInstanceState来使Fargment / Activity在配置更改(例如,轮换)或在后台运行时被操作系统杀死的进程中幸存下来。