30
09-19 12:23:01.084: E/AndroidRuntime(24169): FATAL EXCEPTION: main 
09-19 12:23:01.084: E/AndroidRuntime(24169): Process: com.example.loan, PID: 24169 
09-19 12:23:01.084: E/AndroidRuntime(24169): java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form} 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.handleCallback(Handler.java:733) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.dispatchMessage(Handler.java:95) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Looper.loop(Looper.java:136) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.app.ActivityThread.main(ActivityThread.java:5068) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invokeNative(Native Method) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invoke(Method.java:515) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at dalvik.system.NativeStart.main(Native Method) 

Итак, у меня есть приложение для Android, которое строит с помощью табуса. Есть три вкладки в общей сложности, в tab2, есть кнопка, чтобы совершить сделку фрагмента в tab2 (который звонит функцию в фрагменте активности)IllegalStateException: Фрагмент уже добавлен в фрагмент табов

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
     t.replace(R.id.realtabcontent, mFrag); 
     t.addToBackStack(null); 
     t.commit(); 

Там есть исключение, если я бег так:

  1. Внутри tab2, я нажимаю кнопку, чтобы изменить фрагмент,
  2. Перейдите на другую вкладку (например, вкладка 1 или вкладки 3)
  3. Нажмите кнопку назад
  4. Throw исключение

Как это исправить? Спасибо за помощь

+0

возможно дубликат [IllegalStateException: фрагмент уже добавлен появляется, если приложение было очень долго в фоновом режиме] (http://stackoverflow.com/questions/24629080/illeg alstateexception-fragment-already-added-появляется-if-a-app-was-very-long-in) – FWeigl

+0

, что означает, что обратное является добавлением нового фрагмента, какова логика в backscack? Большое спасибо – user782104

+0

mFrag добавлен в какую-нибудь другую вкладку, кроме tab2? – Akhil

ответ

66

Это происходит, когда мы пытаемся добавить тот же фрагмент или DialogFragment дважды до увольнения,

просто позвоните по телефону

if(mFragment.isAdded()) 
{ 
    return; //or return false/true, based on where you are calling from 
} 
+3

Это должен быть принятый ответ. Принятый ответ не имеет смысла. Во-первых, не должно быть никакого отрицания 'isAdded()'. Во-вторых, в комментариях предлагается, чтобы этот код находился в 'onCreate()', что также бессмысленно. Эта строка кода должна быть помещена непосредственно перед строкой, где фрагмент добавляется (или заменяется), а не в 'onCreate()' или 'onCreateView()'. Слишком поздно выполнять этот код в любом из этих методов. – Alex

+0

'if (fragment.isAdded()) fragmentTransaction.show (фрагмент);' –

4

Вы просто должны проверить одно условие в вашем фрагменте указанной ниже:

if(!isAdded()) 
{ 
    return; 
} 

isAdded = Возвращает истину, если фрагмент в настоящее время добавляется к его деятельности. Взято из официального документа. Это не добавит этот фрагмент, если он уже добавлен

Проверьте ссылку ниже для справки:
http://developer.android.com/reference/android/app/Fragment.html#isAdded()

+0

спасибо за вашу помощь, вы имеете в виду, что я положил if (! IsAdded()) внутри oncreateview? – user782104

+0

Да, вы просто должны указать тот код, который я упомянул в моем ответе выше ... Это означает, что ваш фрагмент уже добавлен в стек. Поэтому нет необходимости добавлять его снова, и он просто возвращается. –

+4

это не имеет смысла, вы не можете вернуть пустоту в onCreateView, вы имели в виду onCreate? Я попробовал это там, и это не помогло моей проблеме. – Fonix

1

Иногда это происходит, если вы не нашли правильный идентификатор из соответствующего макета. Я столкнулся с этой проблемой. Затем, после многих часов, я обнаружил, что я установил неправильный идентификатор recyclerview. Я меняю его и отлично работаю для меня.

Итак, дважды проверьте расположение фрагментов.

+0

Спасибо, это было то же самое для меня. Сообщение об исключении не может вводить в заблуждение. – SqueezyMo

2

Вы просто должны проверить одно условие перед началом операции фрагмента

if (!fragmentOne.isAdded()){ 
      transaction = manager.beginTransaction(); 
      transaction.add(R.id.group,fragmentOne,"Fragment_One"); 
      transaction.commit(); 
} 

это работает perfactly для меня ...

0

Удалите старый фрагмент в случае, если он еще добавляется, а затем добавить новый фрагмент:

FragmentManager fm = getSupportFragmentManager(); 
Fragment oldFragment = fm.findFragmentByTag("fragment_tag"); 
if (oldFragment != null) { 
    fm.beginTransaction().remove(oldFragment).commit(); 
} 
MyFragment newFragment = new MyFragment(); 
fm.beginTransaction().add(newFragment , "fragment_tag"); 
Смежные вопросы