在我的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个不同片段的3个FrameLayouts的布局。每种颜色代表一个不同的片段。
现在我要做的是从 A 切换到 D 。
我这样做是通过FragmentTransaction
将黄色片段替换为蓝色片段。
然而,这仍然保持其他帧可见,所以我通过上面的代码隐藏它们。
现在,Frame.setVisibility()
在commit()之前被调用,所以在 B 和 C 中,蓝色片段“跳”到左边和顶部,之后(在 D 中)被黄色片段替换。这会产生令人讨厌的闪烁。
作为一种解决方法,我现在在事务之前隐藏所有三个FrameLayouts,并在事务完成后重新显示我需要的那些。但仍有问题是我不能通过后退按钮返回,因为这不是真正的交易。
答案 0 :(得分:3)
我会提出两点建议。首先,如果您同时添加片段转换效果并在事务后进行可见性更改,那么可能会大大减少您的闪烁效应
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
其次,我只是放弃让系统管理片段堆栈 - 似乎这只适用于简单的事务。覆盖onBackPressed并在那里做你自己的逻辑。
- 好色