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 и выполните свою собственную логику.
- похотливый