2015-05-20 58 views
4

我试图处理保存fragment的状态,以避免屏幕旋转时出现问题。它发生一件奇怪的事情:当我旋转屏幕首次一切正常,但是当我旋转在第二次应用程序崩溃的画面:片段屏幕旋转后保存碎片状态

//save information: a string and an image 
    @Override 
    public void onSaveInstanceState(Bundle bundle) { 
     super.onSaveInstanceState(bundle); 
     bundle.putString("namesurname", nameSurnameString); 
     bundle.putParcelable("imgprofile", bitmap); 

    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (savedInstanceState != null) { 
      //Restore the fragment's state 
      this.nameSurname.setText(getArguments().getString("namesurname")); 
      this.profileImage.setImageBitmap((Bitmap)getArguments().getParcelable("imgprofile")); 
     } 
    } 

的代码

这里部分这里有活动

//save the fragment 
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    //THE NEXT ONE IS LINE THAT RAISES THE EXCEPTION WHEN I ROTATE THE SCREEN 
    //FOR THE SECOND TIME 
    getSupportFragmentManager().putFragment(outState, "profileFragment", profileFragment); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    FacebookSdk.sdkInitialize(getApplicationContext()); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_drawner); 

    //getting stuff from intent.... 

    if (savedInstanceState != null) { 
     //Restore the fragment's instance 

     this.profileFragment = (ProfileFragment) getSupportFragmentManager().getFragment(
       savedInstanceState, "profileFragment"); 
     restoredProfile=true; 

    } 

错误的代码的一部分,这是一个

05-20 03:11:12.423 30088-30088/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.IllegalStateException: Fragment ProfileFragment{425cdd38} is not currently in the FragmentManager 
      at android.support.v4.app.FragmentManagerImpl.putFragment(FragmentManager.java:573) 
      **at com.mypackage.DrawnerActivity.onSaveInstanceState(DrawnerActivity.java:80)** 
      at android.app.Activity.performSaveInstanceState(Activity.java:1185) 
      at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1233) 
      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3802) 
      at android.app.ActivityThread.access$800(ActivityThread.java:158) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1302) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:176) 
      at android.app.ActivityThread.main(ActivityThread.java:5365) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
      at dalvik.system.NativeStart.main(Native Method) 

回答

3

让我们看看错误,它说你的片段不在你的管理器中,因为当你改变屏幕的状态时,你的活动将被重建,片段也被破坏。现在,该片段不是创建的,也不是实例,因此您的片段不在supportFragmentManager中。

为了保存状态,你可以谷歌关于这个方法setRetainInstance(true),并找出一些解决方案。

希望它能帮助你。

+1

感谢,这才是正道!在这里我找到了正确的解决方案[docs](http://developer.android.com/guide/topics/resources/runtime-changes.html) – Bella

-4

如何在清单文件中的活动添加configChanges属性?

android:configChanges="keyboardHidden|keyboard|orientation" 
5

CANC您检查Why won't Fragment retain state when screen is rotated?

public class SettingsActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState == null) 
     { 
      // Display the fragment as the main content. 
      getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new SettingsFragment()) 
       .commit(); 
     } 
    } 
} 
相关问题