it-swarm.com.ru

IllegalStateException: фрагмент уже добавлен во фрагменте tabhost

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, созданное с помощью tabhost. Всего есть три вкладки, на вкладке 2 есть кнопка для выполнения транзакции фрагмента на вкладке 2 (которая вызывает функцию в операции фрагмента)

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

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

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

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

50
user782104

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

просто позвони 

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

Сказав это, я не вижу причин, по которым нужно удалить старый фрагмент и снова добавить тот же фрагмент, поскольку мы можем обновить пользовательский интерфейс/данные, просто передав параметры в метод внутри фрагмента.

102
Ujju

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

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");
5
vovahost

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

if(!isAdded())
{
    return;
}

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

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

5
Deep Mehta

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

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

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

4
Mehul Solanki

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

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

1
Mihab

Это даже может произойти, если в FragmentStatePagerAdapter вашего ViewPager вы создадите элемент, который уже существует:

override fun getItem(position: Int): Fragment {
    return tabs[0] // Right variant: tabs[position]
}

(private val tabs: List<Fragment> - список фрагментов во вкладках).

0
CoolMind

Для меня это работает так:

Fragment oldFragment = manager.findFragmentByTag(READER_VIEW_POPUP);
if (oldFragment != null) {
    manager.beginTransaction().remove(oldFragment).commit();
}

FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
0
Farid Haq

К моему удивлению, я сделал глупую ошибку, дважды вызвав транзакцию фрагмента:

if (!FirebaseManager.isClientA && !FirebaseManager.isClientB) {
      fragment = new FragmentA();
      getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();
} else if (FirebaseManager.isClientB) {
      fragment = new FragmentB();
} else {
      fragment = new FragmentC();
}
getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();

Убедитесь, что вы не делаете ту же ошибку.

0
Seto Elkahfi