У меня есть активность с двумя атрибутами:
- частный фрагмент firstFragment;
- частный фрагмент secondFragment;
В методе onCreate:
adapter = new MyPagerAdapter(getSupportFragmentManager());
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
pager.setOffscreenPageLimit(6);
pager.setSaveEnabled(true);
где MyPagerAdapter расширяет класс FragmentStatePagerAdapter. В метод getItem():
@Override
public Fragment getItem(int position) {
Bundle args = new Bundle();
switch (position) {
case FIRST:
secondFragment = new FirstFragment();
secondFragment.setArguments(args);
return secondFragment;
case SECOND:
secondFragment = new SecondFragment();
secondFragment.setArguments(args);
return secondFragment;
}
}
и все работает корректно.
Но когда я меняю ориентацию экрана, для личных атрибутов устанавливается значение null, и я потерял ссылку на два фрагмента. Итак, я попытался сериализовать этот фрагмент с помощью:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, FirstFragment.class.getName(), firstFragment);
getSupportFragmentManager().putFragment(outState, SecondFragment.class.getName(), secondFragment);
}
и загрузите их в метод onCreate с помощью:
if (savedInstanceState != null) {
firstFragment = (FirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, FirstFragment.class.getName());
secondFragment = (SecondFragment) getSupportFragmentManager().getFragment(savedInstanceState, SecondFragment.class.getName());
}
Мои вопросы:
<сильный>1. Это правильный способ сериализованного фрагмента в изменение ориентации экрана активности?
<сильный>2. Иногда у меня возникает ошибка: "Unmarshalling unknown type code 55 at offset 448", возможно ли, что это вызвано сериализацией фрагмента?"
РЕДАКТИРОВАТЬ:
Мне нужно иметь фрагменты в качестве атрибутов активности, потому что у меня есть интерфейс прослушивателя в активности, который:
@Override
public void executeTask(String what) {
secondFragment.executeTask(what);
}
этот метод был вызван в firstFragment. Таким образом, FirstFragment может выполнять метод SecondFragment.