2015-05-20 1 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.

Для сохранения состояния, вы можете google об этом методе setRetainInstance(true) и выяснить, какие решения.

Надеюсь, это может вам помочь.

+1

спасибо, это правильный путь! здесь я нашел правильное решение [docs] (http://developer.android.com/guide/topics/resources/runtime-changes.html) – Bella

-4

Как добавить атрибут configChanges при действии в файле манифеста?

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

ОТМ вы проверяете 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(); 
     } 
    } 
}