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
прыгает наверх и / или влево и только потом заменяется.
Кроме того, я, очевидно, не могу вернуться к другой настройке, так есть ли другой способ сделать это?
С уважением, медуза
Редактировать:
Может быть, маленький рисунок проясняет мой вопрос...
A показывает макет из 3 FrameLayouts, содержащий 3 разных фрагмента. Каждый цвет представляет один отдельный фрагмент.
Теперь я хочу переключиться с А на D. Я делаю это, заменяя синий фрагмент желтым фрагментом через FragmentTransaction
,
Тем не менее, это все еще сохраняет другие кадры видимыми, поэтому я скрываю их с помощью кода выше.
Сейчас, Frame.setVisibility()
вызывается до commit(), поэтому в B и C синий фрагмент "перепрыгивает" влево и вверх и только потом (в D) заменяется желтым фрагментом. Это вызывает неприятное мерцание.
В качестве обходного пути теперь я скрываю все три FrameLayouts перед транзакцией и повторно показываю те, которые мне нужны, после завершения транзакции. Но все еще есть проблема, что я не могу вернуться через кнопку возврата, поскольку это не настоящая транзакция.
1 ответ
У меня было бы два предложения. Во-первых, если вы оба добавите эффект перехода фрагмента и сделаете изменения видимости после транзакции, это, вероятно, существенно уменьшит большую часть вашего эффекта мерцания.
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Во-вторых, я просто отказался от того, чтобы система управляла стеком фрагментов для меня - кажется, что это хорошо работает только с простыми транзакциями. Переопределите onBackPressed и сделайте свою собственную логику там.
--randy