Intereting Posts
Как установить текущую дату в DatePicker? Ошибка HTC M8 после обновления 5.0.1 Сбор андроидного датчика на определенный период и вычисление среднего Информация о внешнем оборудовании Просмотр Recycler не прокручивается должным образом после реализации салфетки для обновления макета Включите Интернет на Android во время сна Первый раз сам R.java не генерируется Android Launcher Icon – мои ресурсы по умолчанию / mdpi redudant? Как читать выделенный текстовый файл из sdcard на Android Открыть браузер по указанному URL, используя ACTION_VIEW, не работает, когда Chrome – браузер по умолчанию. Переадресация вызова с одного устройства на другое через Bluetooth Android ActionBar Navigation Tabs выглядит по-разному в телефонах и планшетах Почему пользовательские crouton Styles выглядят серыми, а не их цвет? OnItemClickListener с помощью ArrayAdapter для ListView Привязка данных Android, не работающая с свойством View 'android: tag'

Переместить фрагмент Android в другой контейнер Невозможно изменить идентификатор контейнера фрагмента

Вот что я хотел бы, чтобы мое приложение делало на планшете. В фрагменте (0) есть меню, в котором будут отображаться фрагменты (1) … (n) следующим образом:

----------------- | | | | | | | | | | |(0)| X | X | X | | | | | | | | | | | ----------------- becomes ----------------- | | | | | | | | | | |(0)|(1)| X | X | | | | | | | | | | | ----------------- and then ----------------- | | | | | | | | | | |(0)|(2)|(1)| X | | | | | | | | | | | ----------------- etc... 

Fragment0 никогда не перемещается, другие сдвигаются вправо. Фрагменты, выходящие из края вправо, будут уничтожены.

Поэтому я настраиваю свой XML-макет с горизонтальным LinearLayout и содержащий 4 FrameLayout с соответствующими идентификаторами (фрагмент 0 … фрагмент3)

Я могу создать экземпляр и отобразить фрагмент 0, а затем фрагмент1, но после этого я не могу сдвинуть его вправо, я получаю:

 ERROR/AndroidRuntime(343): FATAL EXCEPTION: main java.lang.IllegalStateException: Can't change container ID of fragment ... 

Единственные связанные с этим вопросы, которые я нашел, – это тот, и тот , и попробовал все различные решения, предлагаемые без везения.

Tried FragmentTransaction.remove() за которым следует .add() , попытался .replace() , попробовал их в разных порядках и совершил на полпути (даже пытающийся совершить дважды, как кто-то предложил), попытался вызвать addToBackStack() . Все еще не повезло.

Вопрос в том, можно ли переместить фрагменты, подобные этому, с помощью FragmentTransaction. Если да, что я делаю неправильно (и бонус, можно ли это оживить?). Если нет, каков был бы правильный способ реализовать это?

Обратите внимание, что я не хочу повторно создавать фрагменты каждый раз (каждый из них выполняет некоторые запросы в Интернете, которые могут занять некоторое время). Вы можете извлечь все данные обратно для активности, чтобы воссоздать один, но я бы предпочел не делать этого, если это возможно …

Solutions Collecting From Web of "Переместить фрагмент Android в другой контейнер Невозможно изменить идентификатор контейнера фрагмента"

Я не знаю, так ли это, но я сделал небольшой пример вашей проблемы. В основном вы будете делать правильное перемещение с использованием файла макета, имея контейнер-обертку для каждого из этих смещающихся фрагментов. Образец кода немного большой для ответа, поэтому я разместил его в виде, который вы можете найти здесь . В этом примере нажмите каждый ListFragment (фрагмент 1 -> фрагмент 2 -> фрагмент 3), чтобы увидеть поведение.

Да, контейнер с фрагментом может быть изменен с помощью функции remove() .

Здесь проблема commit() . Это асинхронный вызов и будет планировать его в основном потоке. Поэтому, чтобы заставить FragmentManager сделать это непосредственно перед добавлением его в другой контейнер.

Для этого нам придется использовать executePendingTransactions() . После вызова этой попытки добавьте фрагмент в новый контейнер.

Документы: executePendingTransactions ()

Образец кода:

 FragmentManager fManager = getSupportFragmentManager(); FragGroups fragGroups = (FragGroups) fManager.findFragmentByTag("groups"); if (fragGroups != null) { fManager.beginTransaction().remove(fragGroups).commit(); fManager.executePendingTransactions(); } else { fragGroups = new FragGroups(); } if (mTwoPane) { fManager.beginTransaction().replace(R.id.fragment_container_groups, fragGroups, "groups").commit(); } else { fManager.beginTransaction().replace(R.id.fragment_container, fragGroups, "groups").commit(); } 

Наслаждаться. Обратная связь приветствуется

редактировать

Я хотел бы добавить пункт здесь. Поскольку у меня была такая же проблема, я столкнулся с этой проблемой и применил предложенные изменения. Проблема по-прежнему сохраняется. Затем я просмотрел последний комментарий по этой теме, который решил мою проблему: удалите addToBackStack() при совершении транзакции или если вы намеренно ее используете, удалите фрагмент из предыдущего стека, прежде чем добавлять его в другой контейнер. Надеюсь, это поможет будущему читателю.