9

Я показываю пустой фрагмент, если у пользователя нет данных. В этом emptyFragment (в onViewCreated) я проверяю условие и иногда хотел бы заменить этот пустой фрагмент на другой, поэтому я вызываю метод для соответствующей операции, который заменил фрагмент.onViewCreated - неправильное место для замены фрагмента?

Некоторые пользователи (в настоящее время только Samsung, 6.0.1, но я не знаю, если что-нибудь значит) опыт аварии на линии, где я executePendingTransactions:

IllegalStateException: 

Fatal Exception: java.lang.RuntimeException 
Unable to resume activity 
{....app.activities.MyActivity_}: 
java.lang.IllegalStateException: FragmentManager is already executing transactions 

Является ли это ошибка в 6.0.1 или onViewCreated Неправильное место для этого?

EDIT

Будет ли это возможное решение?

if (addToBackStack) { 
     getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).addToBackStack(name).commitAllowingStateLoss(); 
     getSupportFragmentManager().executePendingTransactions(); 
    } else { 
     getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentFragment, name).commitNow(); 
    } 

ответ

0

Попробуйте FragmentTransaction.commitNow();, если вы имеете дело с SDK 24, вместо того, чтобы использовать commit()

Для более старых версий: FragmentManager.executePendingTransactions() после вызова commit()

+0

Я использую 'executePendingTransactions()' – swalkner

4

Прежде всего: почему вы не двигаться «условие проверки» в вашей деятельности? Таким образом, вы можете решить, какой именно фрагмент вам нужен: тот, который управляет пустым значением или другим.

Во-вторых: Предлагаю прочитать два небольших учебника по фрагментам commit и state loss. Вы можете найти множество ошибок, связанных с фрагментами.

И, наконец, ответ, связанный с «FragmentManager, уже выполняет транзакции»: есть как минимум два вложенных вызова метода executePendingTransactions(), это означает, что вы запрашиваете диспетчер фрагментов (есть один экземпляр менеджера фрагментов за активность) для выполнения транзакции во время выполнения другой транзакции. Трудно определить, в чем проблема, вы должны опубликовать весь код Activity и всех связанных фрагментов, просто чтобы идентифицировать и удалить один (первый) вызов executePendingTransactions, но я могу дать вам несколько советов:

  1. Не использовать executePendingTransactions(). Трудно выполнить код, требующий своего рода оркестровки между фрагментами
  2. Используйте commit(), если вам не нужен немедленный доступ к фрагментам, которые вы добавляете в свою деятельность. Простая фиксация будет выполнять все транзакции, как только основной поток будет бесплатным.
  3. Если вам нужен немедленный доступ к фрагменту, используйте commitNow(). Честно говоря, я использовал этот метод всего несколько раз, главным образом для правильной обработки DialogFragments.

commitNow() доступен для устройств до 2400, если вы используете support library, что я предлагаю вам принять.

+0

в первую очередь: потому что сначала я показываю фрагмент без данных, а затем, когда сетевой вызов возвращается, я хотел бы заменить его другим ... – swalkner

+0

Вы пытались удалить executePendingTransaction? –

+0

как в моем редактировании? – swalkner