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();
Есть исключение, если я бегу так:
- Внутри вкладки 2 я нажимаю кнопку, чтобы изменить фрагмент
- Перейти к другой вкладке (например, вкладка 1 или вкладка 3)
- Нажмите кнопку назад
- Бросить исключение
Как это исправить? Спасибо за помощь
Ответы
Ответ 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..
}