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

FATAL EXCEPTION: main
Process: com.example.loan, PID: 24169
java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192)
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722)
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533)
    at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5068)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    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. Внутри вкладки 2 я нажимаю кнопку, чтобы изменить фрагмент
  2. Перейти к другой вкладке (например, вкладка 1 или вкладка 3)
  3. Нажмите кнопку назад
  4. Бросить исключение

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

if(!isAdded())
{
    return;
}

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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();

Ответ 7

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

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

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

Ответ 8

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

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();

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

Ответ 9

Добавить фрагмент, как показано ниже

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

Ответ 10

Вы можете попробовать это:

 if (dialogFolderGallery.isAdded()) {
                dialogFolderGallery.dismiss();
            } else { //bla...bla..
}