在我的 Activity
中,我有一个包含 3 个 FrameLayout
的布局,一个位于顶部,一个位于左侧,一个位于“中心”。
现在,我有时只想显示其中一两个。 Atm 我这样做:
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 个不同 fragment 的 3 个 FrameLayout 的布局。每种颜色代表一个不同的 fragment 。
现在我想做的是从A切换到D。
我通过 FragmentTransaction
将蓝色 fragment 替换为黄色 fragment 来实现此目的。
但是,这仍然使其他框架保持可见,因此我通过上面的代码隐藏它们。
现在,Frame.setVisibility()
在 commit() 之前调用,因此在 B 和 C 中,蓝色 fragment “跳跃”左侧和顶部,然后(在 D 中)才被黄色 fragment 替换。这会产生令人讨厌的闪烁。
作为一种解决方法,我现在在事务之前隐藏所有三个 FrameLayout,并在事务完成后重新显示我需要的那些。但仍然存在一个问题,我无法通过后退按钮返回,因为这不是真正的交易。
最佳答案
我有两个建议。首先,如果您添加 fragment 过渡效果并在事务后进行可见性更改,这可能会大大减少闪烁效果
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
其次,我干脆放弃了让系统为我管理 fragment 堆栈——看来这只适用于简单的事务。重写 onBackPressed 并在那里执行您自己的逻辑。
--兰迪
关于Android hive : layout problem - hide/show FrameLayouts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6373631/