У меня проблема с моим приложением для Android.Некоторые устройства, которые используют Android 7.1 или 8.0, часто сообщают о сбое IllegatStateException.Я искал в Google и пытался исправить это много раз, но бесполезно.Я не могу понять, что вызывает этот сбой.Поэтому, пожалуйста, помогите мне, если у вас есть время.Вот полный отчет:
java.lang.IllegalStateException:
at android.support.v4.app.FragmentManagerImpl.addFragment (FragmentManagerImpl.java:60)
at android.support.v4.app.BackStackRecord.executeOps (BackStackRecord.java:137)
at android.support.v4.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:38)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.java:112)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerImpl.java:89)
at android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:21)
at android.support.v4.app.FragmentManagerImpl$1.run (FragmentManagerImpl.java:2)
at android.os.Handler.handleCallback (Handler.java:869)
at android.os.Handler.dispatchMessage (Handler.java:101)
at android.os.Looper.loop (Looper.java:206)
at android.app.ActivityThread.main (ActivityThread.java:6733)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:845)
У меня основное действие содержит FrameLayout.Я использую этот FrameLayout для отображения 5 различных фрагментов, используя:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
switch (button) {
case 1:
ft.replace(R.id.mainframe, fragment1, FRAGMENT1_TAG);
break;
case 2:
ft.replace(R.id.mainframe, fragment2, FRAGMENT2_TAG);
break;
case 4:
Fragment fragment4 = new Fragment();
ft.replace(R.id.mainframe, fragment4, FRAGMENT4_TAG);
break;
}
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);
ft.commit();
Некоторые фрагменты должны быть сохранены для восстановления позже (фрагмент 1 -> 3), некоторые должны быть обновлены (создать новый экземпляр) (фрагмент 4 -> 5).Кроме того, во фрагментах 4 и 5 есть панель просмотра и массив кнопок для перемещения между страницами для каждой.Код просмотра:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager(), new Fragment[] {
new Page1(),
new Page2()
}));
}
private void onButtonTap(Button btn) {
switch (btn.getId()) {
case R.id.button1:
viewPager.setCurrentItem(0, true);
break;
case R.id.button2:
viewPager.setCurrentItem(1, true);
break;
}
}
Я также определяю 2 класса, производных от Dialog и использующих Toast.Я не могу воспроизвести на тренажерах или моих устройствах.Это просто происходит на нескольких устройствах.Что-то не так с моим кодом?Пожалуйста, помогите мне.Это крушение надолго, мне нужно от него избавиться.В ожидании ответа от вас.Большое спасибо.
Длинный
Редактировать 1: Здесь я называю ft.replace для фрагмента 1
@Override
protected void onResume() {
// Check server connection to go back to the first fragment
if (!ConnectivityReceiver.getInstance().isServerConnected()) {
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.main_frame);
if (currentFragment != null &&
(FRAGMENT_4_TAG.equals(currentFragment.getTag()) || FRAGMENT_5_TAG.equals(currentFragment.getTag())) && isActive()) {
.....
ft.replace(fragment1);
}
}
}