java.lang.IllegalStateException отчеты о сбоях из консоли Google Play - PullRequest
0 голосов
/ 25 августа 2018

У меня проблема с моим приложением для 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);
        }
    }
}

1 Ответ

0 голосов
/ 25 августа 2018

Согласно исходному коду, метод addFragment выдает это исключение с сообщением "Fragment already added", если вы пытаетесь добавить Fragment, который уже является членом менеджера.

Теперь версия исходного кода FragmentManagerImpl, которую я вижу, выглядит несколько иначе, чем трассировка стека, так что это немного догадка.Но я подозреваю, что проблема в том, что вы можете звонить ft.replace на fragment2 или fragment1, когда они уже являются частью макета.При определенных обстоятельствах ....

...