Метод Удалить из FragmentTransaction не удаляет фрагмент из Контейнера - PullRequest
5 голосов
/ 20 марта 2012

У меня следующая проблема:

Мое приложение должно выполнять навигацию на планшете следующим образом:

+----+-------+    +----+-------+    +----+-------+    +----+-------+
|    |       |    |    |       |    |    |       |    |    |       | 
|  1 |   2   | -> |  2 |  3    | -> | 3  |  4    | -> | 4  |  ...  |
|    |       |    |    |       |    |    |       |    |    |       |
+----+-------+    +----+-------+    +----+-------+    +----+-------+

Я попытался сделать эту навигацию, используя FRAGMENTS, поскольку навигация динамическая, и я не знаю, сколько уровней будет иметь эта навигация.

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

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

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

При просмотре документации по методу удаления транзакции располагаем следующей информацией: «Удалить существующий фрагмент. Если он был добавлен в контейнер, его представление также удаляется из этого контейнера.»

Но, глядя на фрагмент кода API, все еще есть переменная, которая содержит ссылку на прежний контейнер: mFragmentId.

Кто-нибудь знает способ выполнить эту навигацию или сбросить эту переменную?

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Я думаю, что нашел решение проблемы:

Вместо двух макетов я просто буду использовать один.

Ориентация этого макета горизонтальная, тогда новые фрагменты будут добавляться в левую сторону всегда.

однако, используя следующий код:

Frag1 frag1 = new Frag1();
frag1.setText("Fragment " + Integer.toString(navigation));
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (navigation > 2) {
    ft.remove(fm.findFragmentByTag("f" + Integer.toString(navigation - 2)));
}
ft.add(R.id.Panes, frag1, "f" + Integer.toString(navigation));
if (navigation > 1) {
    ft.addToBackStack(null);
}
ft.commit();

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

Чтобы исправить это, я изменил удаление транзакции, чтобы скрыть, но я все еще не знаю, вызовет ли это проблемы с производительностью.

ft.hide(fm.findFragmentByTag("f" + Integer.toString(navigation - 2)));

Это работает для меня.

0 голосов
/ 21 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...