Android Honeycomb: проблема с макетами - скрыть/показать FrameLayouts

в моем Activity, у меня есть макет, содержащий 3 FrameLayout s, один вверху, один слева и один в центре.

Теперь я иногда хочу отображать только один или два. Атм, я делаю это так:

FrameLayout frame = (FrameLayout) findViewById(R.id.framelayout_menu_left);
frame.setVisibility(...);

frame = (FrameLayout) findViewById(R.id.framelayout_content);
frame.setVisibility(...);

frame = (FrameLayout) findViewById(R.id.framelayout_menu_top);
frame.setVisibility(...);

Однако это может привести к действительно уродливым результатам, например. когда я переключаю "контент" Fragment и скрываю верхнюю часть и/или левую FrameLayout. Все начинает мерцать, когда "контент" Fragment переходит в верхнюю и/или левую и только потом заменяется.

Кроме того, я, очевидно, не могу вернуться к другой настройке, так есть ли другой способ сделать это?

С уважением, медузы

Edit:

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

Layout

A показывает макет из 3 кадров, содержащих 3 разных фрагмента. Каждый цвет представляет собой один отдельный фрагмент.

Теперь я хочу переключиться с A на D. Я делаю это, заменив синий фрагмент желтым фрагментом на FragmentTransaction.

Однако это все еще сохраняет видимость других фреймов, поэтому я скрываю их через код выше.

Теперь Frame.setVisibility() вызывается до commit(), поэтому в B и C синий фрагмент "прыгает" влево, а верхний и только потом (в D) заменяется желтым фрагментом. Это вызывает мерзкое мерцание.

В качестве обходного пути я теперь скрываю все три FrameLayouts перед транзакцией и повторно показываю те, которые мне нужны после завершения транзакции. Но проблема в том, что я не могу вернуться через кнопку "Назад", поскольку это не настоящая транзакция.

Ответ 1

У меня было бы два предложения. Во-первых, если вы оба добавляете эффект перехода фрагмента и изменяете видимость после транзакции, это, вероятно, существенно уменьшит значительную часть эффекта мерцания.

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

Во-вторых, я просто отказался от того, что система управляет стеком фрагментов для меня - кажется, что это работает только с простыми транзакциями. Переопределите onBackPressed и выполните свою собственную логику.

- похотливый