2013-04-25 2 views
3

у меня FragmentActivity:Android Fragment и перезагрузить приложение

public class FragmentActivity extends FragmentActivity 
{ 
    // ... 
    protected void onCreate(Bundle savedInstanceState) { 
     if (savedInstanceState != null) { 
      myFragment = (MyFragment) getSupportFragmentManager().getFragment(
      savedInstanceState, MyFragment.class.getName()); 
     } 
     else { 
      myFragment = new Fragment(myObject); 
     } 
    } 
} 

И в моем фрагменте:

public class MyFragment extends Fragment 
{ 
    public MyFragment(myObject) { 
     super(); 
     this.myObject = myObject; 
     setRetainInstance(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     MyDAO myDAO = new MyDAO (myObject); 
    } 
} 

Все работает, за исключением, когда я закрываю мое заявление, сделать некоторые вещи (мое приложение входит в фон), а затем повторно запустите мое приложение. я получаю NullPointerException на

MyDAO myDAO = new MyDAO (myObject); 

где MyObject является нулевым.

Вызывается сохраненное состояниеInstanceState ... я не понимаю, как это работает.

TY

+0

Может быть, это может помочь вам. http://stackoverflow.com/questions/8474104/android-fragment-lifecycle-over-orientation-changes –

ответ

2

Система убивает свой процесс и экземпляр MyObject является сборщиком мусора. Установка экземпляра, который нужно сохранить, полезен только для изменений ориентации, но имейте в виду, что ваше приложение, работающее в фоновом режиме, может быть убито, когда в системе заканчивается память. Вместо этого передайте эту переменную. Важно реализовать Parcelable или Serializable в классе MyDAO.

PS .: Вы должны иметь пустой конструктор для вашего фрагмента, поскольку система обновляет свой экземпляр, когда ваша деятельность воссоздана:

public MyFragment() { 

} 


public MyFragment(myObject) { 
    super(); 
    setRetainInstance(true); 
    Bundle args = new Bundle(); 
    args.putParcelable("myObject", myObject); 
    setArguments(args); 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    myObject = getArguments().getParcelable("myObject"); 
    MyDAO myDAO = new MyDAO (myObject); 
} 
+0

TY Flavio, это работает, мое приложение запускается снова благодаря пакету и Parcelable. – Aximem

Смежные вопросы