2015-09-11 1 views
0

Итак, у меня есть фрагмент - фрагмент A - который содержит объект - объект O - используемый для настройки TextViews и других элементов. Чтобы создать экземпляр фрагмента, я использую статический метод A.getInstance (O). Объект O является сериализуемым, поэтому я могу отправить его в новый экземпляр фрагмента A через Bundle, используя instance.setArguments и т. Д.Аргументы фрагмента не содержат данных после извлечения из backstack

Я извлекаю O в методе onCreate для A и настраиваю поля, используя O в onViewCreated. Все работает нормально, пока здесь. После I замените A другим фрагментом - фрагментом B - и перейдите обратно от B до A, аргументы Bundle не содержит объект O больше, и я получаю исключение NullPointerException. Сам Bundle не равно нулю, но она не содержит О.

Я использую этот метод для замены фрагментов:

public void replaceCurrentFragment(Fragment fragment) { 
     FragmentTransaction fragmentTransaction = context.getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.frame, fragment).addToBackStack(null).commit(); 
} 

Фрагмент А также отображается с помощью метода выше.

Что я делаю неправильно?

+0

Вы восстанавливаете объект O только из 'Fragment # getArgumnets()'? Вы пытались сохранить и восстановить объект O из состояния экземпляра фрагмента? –

+0

Я сохраняю объект O в экземпляре фрагмента A во время onCreate. Проблема в том, что я не получаю O второй раз, когда я вхожу в onCreate. –

+0

Я имею в виду, вы переопределили Fragment # onSaveInstanceState, чтобы сохранить свой объект, а затем искать его в Bundle, переданный в onCreate (Bundle savedInstanceState)? –

ответ

1

Уведомление Fragment#onCreate(Bundle savedInstanceState) метод. Когда вы впервые создали свой фрагмент с A#getInstance, этот переданный пакет будет пустым. Вы просто извлечете свои объекты O из метода Fragment#getArguments, как и вы.
Для того, чтобы сохранить свой объект для будущего использования, переопределения Fragment#onSaveInstanceState и сохранить свой объект O там (может выглядеть)

private static final String EXTRA_MY_OBJECT = "com.example.extra_my_object"; 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable(EXTRA_MY_OBJECT, mMyObject); 
} 

, а затем в Fragment#onCreate вы можете захватить ваш объект от прошедшего Bundle Так же, как, что:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (savedInstanceState != null) { 
     mMyObject = savedInstanceState.getSerializable(EXTRA_MY_OBJECT); 
    } 
    if (mMyObject == null) { 
     //fragment was created for first time probably, or something went wrong 
     //try to get your object from getArguments 

    } 
} 
+0

Я ценю ваш ответ, однако onSaveInstanceState не вызывается, когда я заменяю фрагмент. Поэтому, когда я возвращаюсь назад, я сталкиваюсь с той же проблемой. Когда текущий фрагмент заменен, последний обратный вызов жизненного цикла - onStop, а onSaveInstanceState никогда не вызывается до этой точки. Так что да. , , –

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

  • Нет связанных вопросов^_^