在片段中调用onSaveInstanceState时?

时间:2014-10-09 08:44:37

标签: android android-fragments fragment

在我的项目中,我使用名为PassengerInformation.java的片段。在该片段中,我使用onSaveInstanceState和onCreate方法。在onCreate方法中,如果没有从onSaveInstanceState传递的包,我应该清除sharedPreferences,如果onSaveInstanceState传递一个bundle,我就不需要清除sharedPreferences。我的问题是当我按回来时,onSaveInstanceState没有被调用我应该记录它但是日志不会打印任何内容。

由于

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    //clear sharedpreferences PassengerInformation is firsttime loaded
    if( savedInstanceState == null ) {  
        Log.i("clear PassengerInformation", "sharedPreferences clear");
        edit.clear().commit();
    }       
}
@Override
public void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    outState.putBoolean("clearPreferences", false);
    Log.i("saveInstanceState PassengerInformation", "save");
}

3 个答案:

答案 0 :(得分:6)

通常,当您将方向从纵向更改为横向时,将调用保存实例状态。

例如:您正在显示结果,如果用户更改方向,则需要显示相同的结果,

onresume - > SavedinstanceState(您将使用键和值来存储数据) - >破坏

and onCreate->恢复savedInstanceState(您将使用密钥的方法getExtra(),并显示存储在restoreSavedInstance状态的结果。

你可以Read a good explanation from this

例如:         public static final String key =“Hello”;

  // you can get the data here.
 @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    savedInstanceState.getString(key); 
    Toast.makeText(this, "Restore state"+ savedInstanceState.getString(key), Toast.LENGTH_SHORT)
    .show();
    text.setText(key); // here the output will be Good morning.

}
// orientation change where from on resume-> destroy state, if you need to handle any saved data
 @Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
     Toast.makeText(this, "saved state", Toast.LENGTH_SHORT)
        .show();
    outState.putString(key, "Good morning");

}

答案 1 :(得分:2)

当用户按下BACK时,不应该调用

onSaveInstanceState()

原因:

如果您正在进行活动并点击设备上的“返回”按钮,则您的活动已完成(),下次启动应用时,它会再次启动(听起来像是重新创建的,不是吗? )但是这次没有保存状态,因为当你点击Back按钮时你故意退出它。

当用户更改配置(例如,旋转屏幕)时,如果Android认为活动存在被破坏的风险,同时仍然可以在堆栈上访问,并且可能还有其他一些情况,则会调用它。

阅读 - onSaveInstanceState when click back button in Android

答案 2 :(得分:1)

在以下情况下会调用片段onSaveInstanceState(@NonNull Bundle outState)

1)在屏幕orientation is changed

2)使用FragmentStatePagerAdapter时:在这种情况下,默认OffscreenPageLimit为1。如果您越过OffscreenPageLimit并使用过FragmentStatePagerAdapter,则在ViewPager中刷片段时,超出此限制的片段将被销毁并执行分离的i.e onStop(), onSaveInstanceState(), onDestroyView(), onDestroy() annd onDetach()