我有一个使用单个自定义DialogFragment类的Activity。它的外观是数据驱动的,因此在调用之间看起来可能完全不同。
这是“全屏”,即
setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme);
响应网络调用的结果,我关闭了当前正在显示的实例(如果有),并关闭了show()的新实例:
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();
这是我的问题:当这段代码运行时,在现有Fragment消失到新的Fragment可见之间,我可以简要看到底层的Activity。我想以某种方式避免这种情况。
我的第一个想法是消除新片段的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;
}
这将确保解雇不发生,直到之后的第二个片段已变得可见。如果您使用构建了一个自定义对话框onCreateDialog(Bundle savedInstanceState)
,请确保将其发布到您在那儿膨胀的视图。
实例既全屏片段和使用show()
和hide()
交易对它们之间的开关(与实际replace()
或remove()
-和-add()
交易)。这些操作在两个片段之间切换的速度应该快得多,因为在执行事务时这两个片段已经或多或少已经完全初始化了(换句话说:“切换”时的延迟更少)。这将对性能造成小的影响,但可能忽略不计。对于数据驱动的片段,这是非常理想的,特别是如果您使用参数捆绑包提供数据,但是通过创建一些setter来克服它并不是很难。
如果两个全屏片段具有相同的背景(即简单的颜色),则可以为活动的背景赋予相同的颜色。当片段被交换出来时,视觉效果将是一瞬间的空白屏幕,但由于内容仅发生变化(因为背景将保持不变),因此侵入性较小。
现在,如果该活动不仅是一个容器,而是显示其自己的内容,则仍然可以通过引入第三个(全屏,不透明)片段作为额外的层来实现上述目的,以隐藏基础活动,同时在全屏片段。只需在执行此操作时将遮盖层保留在适当的位置,并在返回到活动的内容时将其关闭。
如果活动和片段具有非常丰富且装饰不同的背景,则此最后一个选项可能不是理想的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句