问题描述
||
在我的ѭ0中,我有一个布局,其中包含3个ѭ1one,一个在顶部,一个在左侧,一个在“中心”。
现在,有时我只想显示其中的一两个。 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(...);
但是,这可能会得到非常丑陋的结果,例如当我切换\“ content \”Fragment
并隐藏顶部和/或左侧FrameLayout
时。当“内容”ѭ3跳到顶部和/或左侧时,所有操作开始闪烁,然后才替换。
另外,我显然不能导航回其他设置,那么还有其他方法可以做到这一点吗?
亲切的问候,
海蜇
编辑:
也许画些小图可以使我的问题更清楚...
A显示包含3个不同片段的3个FrameLayouts的布局。每种颜色代表一个不同的片段。
现在我要做的是从A切换到D。
我这样做是通过ѭ6将蓝色片段替换为黄色片段。
但是,这仍然保持其他框架可见,因此我通过上面的代码将其隐藏。
现在,在commit()之前调用了called7ѭ,因此在B和C中,蓝色的片段“跳”到左侧和顶部,仅在之后(在D中)被黄色的Fragment替换。这会产生令人讨厌的闪烁。
作为一种解决方法,我现在在事务处理之前隐藏所有三个FrameLayouts,并在事务处理完成后重新显示我需要的三个。但是仍然存在我无法通过“后退”按钮返回的问题,因为这不是真正的交易。
解决方法
我有两个建议。首先,如果您既添加了片段过渡效果,又在交易后进行了可见性更改,则可能会大大减少很多闪烁效果
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
其次,我只是放弃了让系统为我管理片段堆栈的方法-看来这仅适用于简单事务。覆盖onBackPressed并在那里执行您自己的逻辑。
-兰迪