«IllegalStateException: действие было уничтожено», когда вызываемый getSupportFragmentManager () вызван после перезагрузки

У меня есть родительская функция Фрагмента, у которой есть ViewPager, который содержит дочерний ViewPager. Детский ViewPager содержит фрагменты для каждой страницы. Я общаюсь между этими фрагментами дочерних страниц и главной родительской активностью фрагментации, используя интерфейс обратного вызова, например

public interface Callbacks { public void onItemSelected(Link link); } 

В родительской onItemSelected фрагмента я слушаю onItemSelected events, например

 @Override public void onItemSelected(Link link) { Bundle argumentsFront = new Bundle(); argumentsFront.putParcelable(FragmentComments.ARG_ITEM_ID, link); fragmentComments = new FragmentComments(); fragmentComments.setArguments(argumentsFront); getSupportFragmentManager().beginTransaction().replace(R.id.post_container, fragmentComments).commitAllowingStateLoss(); } 

Теперь это прекрасно работает, когда приложение запускается впервые.

Если вы поворачиваете устройство для изменения ориентации, активность перезапускается. Все фрагменты setRetainInstance(true); инициализируются, поскольку я использую setRetainInstance(true); (Я не называю setRetainInstance (true) на странице Фрагменты дочернего ViewPager, поскольку он не поддерживается). Однако, если я нажимаю элемент списка во Фрагменте дочернего ViewPager, я получаю это исключение:

 FATAL EXCEPTION: main java.lang.IllegalStateException: Activity has been destroyed at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342) at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595) at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578) 

кто-нибудь знает, почему это произошло?

благодаря

Solutions Collecting From Web of "«IllegalStateException: действие было уничтожено», когда вызываемый getSupportFragmentManager () вызван после перезагрузки"

Когда вы поворачиваете устройство, Android сохраняет, уничтожает и воссоздает вашу Activity и ее ViewPager Fragments . Поскольку ViewPager использует FragmentManager вашей Activity , он сохраняет и повторно использует эти Fragments для вас (и не создает новые), поэтому они будут хранить старые ссылки на вашу (теперь уничтоженную) оригинальную Activity , и вы получите это IllegalStateException .

В своем ребенке Fragments попробуйте что-то вроде этого:

 @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.v(TAG, "onAttach"); // Check if parent activity implements our callback interface if (activity != null) { try { mParentCallback = (Callbacks) activity; } catch (ClassCastException e) { } } } 

Затем, когда происходит выбор:

 if(mParentCallback != null) { mParentCallback.onItemSelected(selectedLink); } 

Поскольку onAttach как часть жизненного цикла Fragment , ваши Fragments будут обновлять свою обратную ссылку при вращении.

У меня была аналогичная проблема, я думаю, что это потому, что фрагменты сохранены и содержат ссылку на разрушенную активность, мое решение состояло в том, чтобы сохранить ссылку на фрагмент в активности, например, фрагмент myfragment = null. И затем используйте следующий код в MyFragment:

  public void onAttach(Activity activity) { super.onAttach(activity); ((TestActivity)activity).contentFragment = this; } 

Имел подобный вопрос. В принципе, если ViewPager имеет только пару фрагментов, тогда сохраняйте ссылки на них в текущей активности. НЕ ВЫЙТИ getItem pagerAdapter (), потому что он создает новый фрагмент и не привязан к какой-либо деятельности, и поэтому мы видим исключение «Активность разрушено». Если вы не хотите хранить ссылки на фрагменты, вы можете использовать метод findViewWithTag () для получения объекта фрагмента.

При совершении транзакций в обратном вызове OnPostResume исправлена ​​проблема для меня. Благодаря следующему блогу http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

 @Override protected void onPostResume() { super.onPostResume(); // Commit your transactions here. } 

У меня была эта проблема с вложенными фрагментами, и ни один из решений stackoverflow не работал для меня. Просто кажется, что есть ошибка в библиотеке поддержки, когда упущенные фрагменты по-прежнему сохраняют указатели на предыдущую активность (поэтому getFragmentManager () просто возвращает null, потому что он вызван уже уничтоженным действием), поэтому вам нужно управлять указателями самостоятельно. У меня получилось следующее решение:
1. В первом фрагменте уровня я сохранял указатель на активность в методе

 public void onAttach(Activity activity) { super.onAttach(activity); parentActivity = activity; // parentActivity is static variable } 

2. В работе, которая обрабатывает фрагменты, я получил этот код:

 private void launchFragment(Fragment fragment, Activity parent) { FragmentTransaction transaction; if(parent == null) transaction = mFragmentManager.beginTransaction(); else // for nested child fragments, workaround for Android parent pointer bug transaction = parent.getFragmentManager().beginTransaction(); transaction.replace(R.id.container, fragment); transaction.addToBackStack(null); transaction.commit(); } 

Вы должны передать parentActivity фрагмента уровня FIRST только тогда, когда вы вызываете фрагменты SECOND level (вложенные), так как кажется, что эта ошибка только с вложенными после того, как вы перенесли приложение с переднего плана.