Intereting Posts
Gradle kotlin Неподдерживаемый метод Dependencies.getAtoms () Лучшая практика внедрения обратной связи Retrofit для воссозданной деятельности? Как реализовать слайд, чтобы показывать действия в recyclerview? Phonegap: можно ли обнаружить swipeLeft и SwipeRight touch от Javascript? Нажатие на Уведомление не начинается с намеченной деятельности? Почему моя служба создается несколько раз? Утрата электронной почты, игнорирующая прерывания строки в предустановленном тексте (Android) Рисование линии с определенной шириной пикселя Есть ли какой-либо платежный шлюз, ориентированный на Индию? Редактор макета студии Android показывает пользовательские свойства вида? Qt Android: виртуальная клавиатура продолжает переходить в верхний регистр, когда я набираю QLineEdit Запустить Android gps-сервис Разница между InstrumentationTestCase и AndroidTestCase Интеграция приложений Android Facebook с GAE Android Невозможно удалить цвет сверху и снизу

Android Fragment – переход от одного вида к другому?

Могу ли я сначала добавить фрагмент в представление, затем «отделить» его, а затем «снова подключить» его к другому представлению?

В коде я хочу:

fragOne one = new fragOne(); getSupportFragmentManager().beginTransaction() .add(R.id.left, one, "tag").commit(); getSupportFragmentManager().beginTransaction() .detach(one).commit(); // or .remove(), or .addToBackStack(null).remove() getSupportFragmentManager().executePendingTransactions(); getSupportFragmentManager().beginTransaction() .add(R.id.right, one).commit(); 

Но это порождает ошибку:

 04-05 13:28:03.492: E/AndroidRuntime(7195): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.trybackstack/com.example.trybackstack.MainActivity}: java.lang.IllegalStateException: Can't change container ID of fragment fragOne{40523130 #0 id=0x7f080000 tag}: was 2131230720 now 2131230721 

Спасибо за помощь!

Solutions Collecting From Web of "Android Fragment – переход от одного вида к другому?"

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

 View vv = fragment.getView(); ViewGroup parent = (ViewGroup)vv.getParent(); parent.removeView(vv); newparent.addView(vv, layoutParams); 

После того, как вы попробовали все ответы на подобные вопросы, похоже, что я нашел способ сделать трюк.

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

Но это не работает каждый раз. Вторая проблема – это задний стек. Это как-то блокирует транзакцию.

Таким образом, полный код, который работает для меня, выглядит так:

 manager.popBackStackImmediate(null, manager.POP_BACK_STACK_INCLUSIVE); manager.beginTransaction().remove(detailFragment).commit(); manager.executePendingTransactions(); manager.beginTransaction() .replace(R.id.content, masterFragment, masterTag) .add(R.id.detail, detailFragment, activeTag) .commit(); 

Я думаю, вы бы это выяснили к настоящему времени, но я не вижу удовлетворительного ответа. Итак, я публикую это для других, которые могут ссылаться на это в будущем.

Если вы хотите переместить фрагмент из одного представления в другое, выполните следующие действия:

 android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragment1); fragmentTransaction.commit(); fragmentManager.executePendingTransactions(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.containerToMoveTo, fragment1); fragmentTransaction.commit(); 

Таким образом, вам не нужно дублировать фрагмент.

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

  FragmentTransaction ft = mFragmentManager.beginTransaction(); ft.remove(one); Fragment newInstance = fetchOldState(one); ft.add(R.id.right, newInstance); ft.commit(); //TO fetch the old state private Fragment fetchOldState(Fragment f) { try { Fragment.SavedState oldState= mFragmentManager.saveFragmentInstanceState(f); Fragment newInstance = f.getClass().newInstance(); newInstance.setInitialSavedState(oldState); return newInstance; } catch (Exception e) // InstantiationException, IllegalAccessException { } } 

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

Добавление к Яну. Ответ Юркина . Убедитесь, что для транзакции не применяются какие-либо переходы, поскольку они, как кажется, задерживают отрыв фрагмента.