如何在不显示父级活动的情况下将一个全屏对话框片段替换为另一个?

ph

我有一个使用单个自定义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?

MH。

根据您的活动和全屏片段的外观,您会想到一些选择。

  1. 遵循您自己的第一个想法:尝试将第二个数据驱动的片段发布到根视图的处理程序中,以排定第二个数据驱动的片段。那是:

    @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),请确保将其发布到您在那儿膨胀的视图。

  2. 实例既全屏片段和使用show()hide()交易对它们之间的开关(与实际replace()remove()-和-add()交易)。这些操作在两个片段之间切换的速度应该快得多,因为在执行事务时这两个片段已经或多或少已经完全初始化了(换句话说:“切换”时的延迟更少)。这将对性能造成小的影响,但可能忽略不计。对于数据驱动的片段,这是非常理想的,特别是如果您使用参数捆绑包提供数据,但是通过创建一些setter来克服它并不是很难。

  3. 如果两个全屏片段具有相同的背景(即简单的颜色),则可以为活动的背景赋予相同的颜色。当片段被交换出来时,视觉效果将是一瞬间的空白屏幕,但由于内容仅发生变化(因为背景将保持不变),因此侵入性较小。

    现在,如果该活动不仅是一个容器,而是显示其自己的内容,则仍然可以通过引入第三个(全屏,不透明)片段作为额外的层来实现上述目的,以隐藏基础活动,同时在全屏片段。只需在执行此操作时将遮盖层保留在适当的位置,并在返回到活动的内容时将其关闭。

    如果活动和片段具有非常丰富且装饰不同的背景,则此最后一个选项可能不是理想的选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不显示第一个组件的情况下将一个组件路由到另一个组件?-角度

如何在另一个活动中打开警报对话框

如何在此对话框中启动另一个活动?

PyQt:如何创建一个对话框作为另一个对话框的子级

如何在不重定向到另一个组件/页面的情况下使对话框以有角度的方式弹出?

Python:如何在不删除重复项的情况下将一个数据帧中的列值替换为另一个

如何在另一个上下文中显示对话框?

按下对话框的按钮时是否打开另一个活动?

我如何让我的片段与另一个片段一起全屏显示,因为它是父片段而不是活动?

Android:无法将活动内的片段替换为另一个片段?

如何在不显示任何div的情况下将html div复制到另一个div

将值传递给从另一个活动运行的对话框

显示一个警报对话框,关闭并显示另一个警报对话框

如何在不放大fabricjs的情况下显示另一个画布

如何在不翻转的情况下显示Boxplot与另一个图的翻转?

如何在不中断的情况下将显示逻辑放入另一个函数(并访问对象属性)?

如何在不复制的情况下将一个向量移动到另一个向量

如何在没有位置的情况下将一个div与另一个div重叠

如何在不挤压的情况下将视图与另一个视图对齐

将一个活动转换为另一个活动的片段(android)

取消从另一个对话框片段启动的对话框片段会导致非法状态异常

如何在不覆盖OnBackPressed()的情况下从通知启动的活动导航到另一个活动?

如何在不使用静态的情况下将信息从一个类传输到另一个类以显示它?

如何从另一个进程显示模式对话框窗口?

Android:如何在不引起用户注意的情况下从一个片段移动到另一个片段?

每次出现的情况下,将OCaml列表中的某个值替换为另一个值

如何在运行另一个函数后关闭 tkinter 对话框?

如何将数据从瀑布对话框传输到另一个?

第一个活动中显示的对话框,而不是创建片段的对话框