У меня есть приложение с иерархией, как это:Android FragmentTab хозяин и фрагменты внутри фрагментов
FragmentTabHost (Main Activity)
- Fragment (tab 1 content - splitter view)
- Fragment (lhs, list)
- Framment (rhs, content view)
- Fragment (tab 2 content)
- Fragment (tab 2 content)
Все фрагмент мнения раздувается из ресурсов.
Когда приложение запускается, все появляется и выглядит нормально. Когда я переключаюсь с первой вкладки на другую вкладку и обратно, я получаю исключения надувания, пытаясь воссоздать взгляды вкладки 1.
Рытье немного глубже, это то, что происходит:
- На первой загрузке, раздувая вид разветвитель вызывает его два дочерних фрагментов, которые будут добавлены к менеджеру фрагмента.
- При переключении с первой вкладки ее вид уничтожается, но его дочерние фрагменты остаются в менеджере фрагментов
- При переключении на первую вкладку вид повторно завышен и поскольку старые дочерние фрагменты по-прежнему в менеджере фрагментов исключение генерируется при создании новых дочерних фрагментов (путем инфляции)
Я работал над этим, удалив дочерние фрагменты из диспетчера фрагментов (я использую Моно), и теперь я может переключаться на вкладки без исключения.
public override void OnDestroyView()
{
var ft = FragmentManager.BeginTransaction();
ft.Remove(FragmentManager.FindFragmentById(Resource.Id.ListFragment));
ft.Remove(FragmentManager.FindFragmentById(Resource.Id.ContentFragment));
ft.Commit();
base.OnDestroyView();
}
Поэтому у меня есть несколько вопросов:
- СОБРАННОЙ правильный способ сделать это?
- Если нет, как я должен это делать?
- В любом случае, как сохранение состояния экземпляра связывает все это, чтобы я не терял состояние отображения при переключении вкладок?
ОК, это звучит многообещающе. Как я могу сказать, что надуватель использует диспетчер дочерних фрагментов вместо родительского? –
Вы добавляете дочерний фрагмент внутри родительского фрагмента, используя код родительского фрагмента, используя ChildFragmentManager для добавления своих дочерних элементов. Затем надуватель, который использует ваш метод обратного вызова onCreateView вашего (дочернего) фрагмента: https://developer.android.com/reference/android/app/Fragment.html#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle). –
Вам, вероятно, нужно сделать еще несколько поисковых запросов/stackoverlowing, чтобы посмотреть, как бороться с дочерними фрагментами в Mono. Я не могу вам помочь (я использую Java). –