我有一个使用单个自定义 DialogFragment 类的活动。它的外观是数据驱动的,因此不同的调用看起来可能相当不同。
它是“全屏”,即
setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme);
为了响应网络调用的结果,我解雇()当前显示的实例(如果有)并显示()一个新的实例:
final CustomDialogFragment dialog = (CustomDialogFragment) getSupportFragmentManager().findFragmentByTag(DIALOG_TAG_CUSTOM);
if (dialog != null)
dialog.dismiss();
final CustomDialogFragment newdialog = new CustomDialogFragment();
// configure some stuff on the new fragment that influences its appearance
newdialog.show();
这是我的问题:当这段代码运行时,在现有片段消失和新片段变得可见之间,我可以短暂地看到底层活动。我想以某种方式避免这种情况。
我的第一个想法是忽略新片段的 onResume() 方法内的现有片段。也就是说,尽可能长时间地延迟“dismiss()”调用,希望在前一个片段被消除之前新片段已经可见(遮挡前一个片段)。但这没有效果。
我正在考虑的另一个选择是使片段“可重新配置”,以便我可以“推入”新数据并触发它重新绘制所有视图以匹配新数据。在此解决方案中,我将简单地重新配置现有片段(如果有),而不是忽略它并显示一个新片段。
我的问题:在关闭一个全屏 DialogFragment 并显示另一个全屏 DialogFragment 时,是否有一种更简单和/或更直接的方法来绕过这种临时“查看”底层 Activity 的情况?
根据您的活动和全屏片段的外观,我会想到一些选项。
-
按照您自己的第一个想法:尝试通过将第一个数据驱动片段发布到根视图的处理程序来安排在第二个片段中消除第一个数据驱动片段。那是:
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = ... // inflate view
root.post(new Runnable() {
@Override public void run() {
// create & commit fragment transaction
// to remove first fragment here
}
};
return root;
}
这应该确保解雇不会发生,直到after第二个片段已变得可见。如果您使用构建自定义对话框onCreateDialog(Bundle savedInstanceState)
,请确保您发布到您在那里膨胀的视图。
实例化全屏片段并使用show()
and hide()
在它们之间切换的事务(而不是实际的replace()
or remove()
-and-add()
交易)。这些操作在两个片段之间切换应该要快得多,因为在执行事务时,两个片段都已经或多或少地完全初始化了(换句话说:“切换”时的延迟更少)。这将对性能产生较小的影响,但可能可以忽略不计。对于数据驱动的片段来说,这并不理想,特别是如果您使用参数包提供数据,但通过创建一些设置器来克服并不难。
如果两个全屏片段具有相同的背景(即简单的颜色),那么您可以为 Activity 的背景指定相同的颜色。当片段被交换时,视觉结果将是暂时的空白屏幕,但干扰较小,因为只有内容发生变化(因为背景将保持不变)。
现在,如果 Activity 不仅仅是一个容器,而是显示自己的内容,您仍然可以通过引入第三个(全屏、不透明)片段作为额外层来实现与上面相同的效果,以在切换时隐藏底层 Activity全屏片段。执行此操作时,只需将模糊层保留在适当的位置,并在返回活动内容时将其关闭。
如果活动和片段具有非常丰富且装饰不同的背景,那么最后一个选项可能并不理想。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)