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

jph*_*jph 5 android android-fragments android-dialogfragment android-fragmentactivity

我有一个使用单个自定义DialogFragment类的Activity。它的外观是数据驱动的,因此在调用之间看起来可能完全不同。

这是“全屏”,即

setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme);
Run Code Online (Sandbox Code Playgroud)

响应网络调用的结果,我关闭了当前正在显示的实例(如果有),并关闭了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();
Run Code Online (Sandbox Code Playgroud)

这是我的问题:运行此代码块时,在现有Fragment消失到新Fragment可见之间,我可以简要看到底层的Activity。我想以某种方式避免这种情况。

我的第一个想法是消除新片段的onResume()方法内的现有片段。也就是,尽可能长地延迟“ dismiss()”调用,以期希望新的片段在取消前一个片段之前就已经可见(使上一个片段模糊)。但这没有效果。

我正在考虑的另一个选择是使片段“可重新配置”,以便我可以“推入”新数据并触发它重新绘制其所有视图以匹配新数据。在此解决方案中,我将简单地重新配置现有片段(如果有的话),而不是将其解散并显示一个新片段。

我的问题:解散一个全屏DialogFragment并显示另一个全屏DialogFragment时,是否有一种更容易和/或更直接的方法来解决此临时“偷看”底层的Activity?

MH.*_*MH. 1

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

  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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这应该确保在第二个片段变得可见之前不会发生解雇。如果您使用 构建自定义对话框onCreateDialog(Bundle savedInstanceState),请确保您发布到在那里膨胀的视图。

  2. 实例化全屏片段并使用show()and hide()transactions 在它们之间切换(而不是实际的replace()or remove()-and-add()事务)。这些操作在两个片段之间切换应该要快得多,因为在执行事务时,两个片段都已经或多或少地完全初始化了(换句话说:“切换”时的延迟更少)。这将对性能产生较小的影响,但可能可以忽略不计。这对于数据驱动的片段来说并不理想,特别是如果您使用参数包提供数据,但通过创建一些设置器来克服并不难。

  3. 如果两个全屏片段具有相同的背景(即简单的颜色),那么您可以为活动的背景指定相同的颜色。当片段被交换时,视觉结果将是暂时的空白屏幕,但干扰较小,因为只有内容发生变化(因为背景将保持不变)。

    现在,如果 Activity 不仅仅是一个容器,而是显示自己的内容,您仍然可以通过引入第三个(全屏、不透明)片段作为额外层来实现与上面相同的效果,以在切换时隐藏底层 Activity全屏片段。执行此操作时,只需将模糊层保留在适当的位置,并在返回活动内容时将其关闭。

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