Информация: у меня есть двухпанельный макет (2 дочерних Fragments
) внутри ParentFragment
, который, конечно же, находится внутри FragmentActivity
. У меня setRetainInstance(true)
на ParentFragment
. При изменении ориентации левый дочерний фрагмент не уничтожается (onCreate()
не вызывается), что нормально (из-за того, что родительский объект сохранил свой экземпляр).
Проблема: при изменении ориентации правый фрагмент уничтожается (вызывается onCreate()
). Какого черта правый фрагмент разрушен, а левый - нет?
РЕДАКТИРОВАТЬ: если я удалю setRetainInstance(true)
, тогда onCreate()
левого фрагмента будет вызван дважды (lol wtf), а правый onCreate()
фрагмента вызывается один раз. Так что это тоже нехорошо ...
Код ниже для ParentFragment:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_schedule, container, false);
setHasOptionsMenu(true);
if (getChildFragmentManager().findFragmentById(R.id.fragment_schedule_framelayout_left) == null ||
!getChildFragmentManager().findFragmentById(R.id.fragment_schedule_framelayout_left).isInLayout())
{
if (mPresentationsListFragment == null)
mPresentationsListFragment = PresentationsListFragment.newInstance(PresentationsListFragment.TYPE_SCHEDULE, mScheduleDate);
getChildFragmentManager().beginTransaction()
.replace(R.id.fragment_schedule_framelayout_left, mPresentationsListFragment)
.commit();
}
mPresentationsListFragment.setOnPresentationClickListener(this);
return view;
}
@Override
public void onPresentationClick(int id)
{
if (Application.isDeviceTablet(getActivity()))
{
if (getChildFragmentManager().findFragmentById(R.id.fragment_schedule_framelayout_right) == null)
{
if (mPresentationDetailFragment == null)
mPresentationDetailFragment = PresentationDetailFragment.newInstance(id);
else
mPresentationDetailFragment.loadPresentation(id);
getChildFragmentManager().beginTransaction()
.replace(R.id.fragment_schedule_framelayout_right, mPresentationDetailFragment)
.commit();
}
else
mPresentationDetailFragment.loadPresentation(id);
}
else
{
Intent presentationDetailIntent = new Intent(getActivity(), PresentationDetailActivity.class);
presentationDetailIntent.putExtra(PresentationDetailActivity.KEY_PRESENTATION_ID, id);
startActivity(presentationDetailIntent);
}
}
Решение LE: Большое спасибо antonyt, ответ приведен ниже. Единственные изменения, необходимые для выполнения, находятся внутри onCreateView () родительского Fragment
.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_schedule, container, false);
setHasOptionsMenu(true);
if (getChildFragmentManager().findFragmentById(R.id.fragment_presentations_framelayout_left) == null)
{
mPresentationsListFragment = PresentationsListFragment.newInstance();
mPresentationsListFragment.setOnPresentationClickListener(this);
getChildFragmentManager().beginTransaction()
.add(R.id.fragment_presentations_framelayout_left, mPresentationsListFragment)
.commit();
}
return view;
}
ParentFragment.setRetainState(true)
не сохраняет состояние его дочерних фрагментов, независимо от того, установлен ли этот фрагмент из макета или динамически вParentFragment.onCreateView()
. - person riwnodennyk   schedule 05.03.2013