Проблемы с фрагментами Android

Я использую Fragments для представления разных представлений в своем приложении. Я заменяю фрагменты, используя следующий код при навигации между представлениями:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right); ft.replace(R.id.main_linearlayout_fragmentcont, frag); ft.addToBackStack(null); ft.commit(); 

При повороте я столкнулся с рядом проблем, и деятельность была восстановлена. Мне нужно поддерживать старые версии android soroid: configChanges = «ориентация» не является вариантом. Многие проблемы связаны с тем, как Android сохраняет состояние фрагмента.

Это проблемы, с которыми я сталкиваюсь:

1) Переходы фрагмента не помнят мои пользовательские анимации для поп-событий, когда они автоматически восстанавливаются после поворота. Однако они помнят мой BackStack. Я знаю, что могу написать свой собственный обработчик, который заменит использование анимации и избавится от поп-музыки, но мне было интересно, есть ли способ сбросить анимацию перед вызовом popBackStack () или способом, чтобы FragmentManager помнил Анимации, когда он автоматически восстанавливается после поворота.

2) Другая проблема заключается в том, что у меня есть куча дочерних представлений (linearlayouts) в одном из моих представлений фрагментов верхнего уровня, которые содержат их собственные фрагменты. Эти дочерние представления создаются и заполняются программно. Когда мой фрагмент воссоздается после ротации, я программно восстанавливаю дочерние представления в onCreateView объекта фрагмента, и в итоге я получаю дубликаты фрагментов под каждым из дочерних представлений (1 – я создаю программно и 1 – Фрагменты Android создают из восстановления). Я предполагаю, что это потому, что я программно восстанавливаю дочерние представления после вращения с одним и тем же идентификатором. Есть ли способ предотвратить восстановление фрагментов? Когда Android вводит фрагменты из saveState в эти представления, я программирую программно? Как я могу предотвратить это?

3) Вышеприведенный код замены, похоже, многократно срабатывает для параметра CreateCreateView для моего объекта frag (Fragment). Это без вращения и происходит, когда я запускаю вышеуказанный код только один раз. Есть ли причина, по которой onCreateView из фрагмента будет вызываться несколько раз с вышеуказанным кодом?

Вопросы о фрагментах: 1) Могу ли я предотвратить Android от автоматического восстановления фрагментов при восстановлении активности? Как я могу это сделать? Он основан на идентификаторе LinearLayout? Могу ли я вызвать removeAllViews LinearLayout, содержащий фрагмент onStop? Таким образом, вид не существует, когда он сохраняет?

2) Есть ли способ добавить фрагмент к LinearLayout, к которому у меня есть ссылка, но у которого нет идентификатора? Похоже, что Fragment add, replace APIs требует идентификатор int.

Благодаря!

1) если вы узнаете, как мне сообщить, я тоже разозлился

2) вы, вероятно, вызываете add в FragmentTransaction внутри фрагмента верхнего уровня, но операция восстановления также добавляется, поэтому дублирует! Вариант 1. Вместо этого используйте replace . Вариант 2. (предпочтительнее) Проверить if(savedInstances==null) { // do transaction } else { //let the system rebuilt it itself}

3) Если вы меняете макет (вызывая добавление или замену) представления, которое является частью фрагмента, менеджер вызывает метод для создания представления снова. Я все еще не уверен, что это ошибка или функция, и если это особенность, почему это так. Если вы узнаете, дайте мне знать

1) (предположительно 4, нет?) Не путают с макетами, если вы хотите удалить их, удалите их, используя while(popBackStackImmediatly){} , но если вы пойдете глубже и поймете, что делает система, обычно есть Нет причин не позволять ему делать это автоматически.

2) (предположительно 5, нет?), Если у вас есть ссылка, у вас есть id View.getId ()

Счастливое кодирование!

Если вы меняете ориентацию устройства, проверьте проверку в действии, а также управляйте фрагментом со стеком, чтобы ваш поток не повредил в этом случае.

 if(savedInstanceState == null) { mFragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); FragmentOne fragment = new FragmentOne(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); }