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

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

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

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 прыгает наверх и / или влево и только потом заменяется.

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

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

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

Может быть, маленький рисунок проясняет мой вопрос...

раскладка

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

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

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

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

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

1 ответ

Решение

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

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

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

--randy

Другие вопросы по тегам