Android FragmentTransaction() Исключение IllegalStateException: фрагмент уже добавлен

#java #android #android-fragments #fragment

#java #Android #android-фрагменты #фрагмент

Вопрос:

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

     // Set up the spinner to select days of the week.
        Spinner spinner = (Spinner) weekView.findViewById(R.id.day_selecter);
        spinner.setOnItemSelectedListener(new OnItemSelectedListener(){

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id) {
                // For each day of the week, create a new instance of Switches
                // get an instance of FragmentTransaction from your Activity
                FragmentManager fm = getFragmentManager();
                FragmentTransaction fragmentTransaction = fm.beginTransaction();
                Fragment frag = fm.findFragmentByTag(Integer.toString(pos));
                if(frag == null) {
                    switch(pos) {
                        case 0: frag = new mondayFragment();
                                break;
                        case 1: frag = new tuesdayFragment();
                                break;
                        case 2: frag = new wednesdayFragment();
                                break;
                        case 3: frag = new thursdayFragment();
                                break;
                        case 4: frag = new fridayFragment();
                                break;
                        case 5: frag = new saturdayFragment();
                                break;
                        case 6: frag = new sundayFragment();
                                break;
                    }
                    fragmentTransaction.add(R.id.week_program_switches, frag, Integer.toString(pos));
                }
                else
                    fragmentTransaction.replace(R.id.week_program_switches, frag, Integer.toString(pos));
                fragmentTransaction.commit();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
 

Программе удается загрузить фрагмент, соответствующий первому дню недели, то есть фрагменту mondayFragment, в контейнер. Каждый фрагмент содержит текстовые поля и флажки, поэтому мне нужно сохранить представление каждого загруженного фрагмента. Иногда приложение позволяет мне выбрать другой день, но содержимое предыдущего фрагмента переносится, и в конечном итоге приложение завершает работу с ошибкой IllegalStateException: Day уже добавлен в транзакцию фрагмента. в других случаях простой выбор другого дня в счетчике немедленно приводит к сбою приложения с той же ошибкой. Мне действительно нужна ваша помощь в этом, так как у меня совсем нет идей.

Несколько замечаний: 1. Я не добавил ни одного фрагмента статически ни в один макет. Я видел, что это является причиной многих связанных с этим проблем. 2. Первоначально я намеревался использовать один фрагмент и создать несколько экземпляров в контейнере FrameLayout, но у меня возникли аналогичные проблемы с сохранением содержимого в каждом экземпляре.

Комментарии:

1. происходит ли сбой только при повторном нажатии на один и тот же фрагмент дважды?

2. Я думаю, что, возможно, я исправил это, просто заменив FragmentTransaction.add() на FragmentTransaction.replace(). Теперь содержимое не перекрывается, и пока никаких сбоев нет .. пальцы скрещены