gpt4 book ai didi

android - 如何在不显示父 Activity 的情况下用另一个全屏对话框 fragment 替换?

转载 作者:太空宇宙 更新时间:2023-11-03 10:19:54 25 4
gpt4 key购买 nike

我有一个使用单个自定义 DialogFragment 类的 Activity 。它的外观是数据驱动的,因此每次调用看起来都大不相同。

它是“全屏”,即

setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme);

作为对网络调用结果的响应,我 dismiss() 当前显示的实例(如果有的话)并 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 。我想以某种方式避免这种情况。

我的第一个想法是关闭新 fragment 的 onResume() 方法内的现有 fragment 。也就是说,尽可能长时间地延迟“dismiss()”调用,希望在前一个 fragment 被解雇之前新 fragment 已经可见(遮住前一个 fragment )。但这没有任何效果。

我正在考虑的另一个选择是使 fragment “可重新配置”,这样我就可以“插入”新数据并触发它重绘所有 View 以匹配新数据。在此解决方案中,我将简单地重新配置现有 fragment (如果有的话),而不是将其关闭并显示一个新 fragment 。

我的问题:在关闭一个全屏 DialogFragment 并显示另一个时,是否有更简单和/或更直接的方法来绕过对底层 Activity 的临时“窥视”?

最佳答案

根据您的 Activity 和全屏 fragment 的外观,我会想到一些选项。

  1. 遵循您自己的第一个想法:尝试通过将第一个数据驱动 fragment 发布到 Root View 的处理程序来安排在第二个中关闭第一个数据驱动 fragment 。即:

    @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;
    }

    这应该确保在第二个 fragment 变得可见之前之后不会发生解雇。如果您使用 onCreateDialog(Bundle savedInstanceState) 构建自定义对话框,请确保您发布到您在其中扩充的 View 。

  2. 实例化两个全屏 fragment 并使用 show()hide() 事务在它们之间切换(而不是实际的 replace( )remove()-and-add() 事务)。这些操作在两个 fragment 之间切换应该快得多,因为在执行事务时两个 fragment 或多或少已经完全初始化(换句话说:“切换”时延迟更少)。这会产生很小的性能影响,但可能可以忽略不计。这对于数据驱动的 fragment 来说并不理想,尤其是当您使用参数包提供数据时,但通过创建一些 setter 也不太难克服。

  3. 如果两个全屏 fragment 具有相同的背景(即简单的颜色),则您可以为 Activity 的背景赋予相同的颜色。当 fragment 被换出时,视觉结果将是一个暂时的空白屏幕,但干扰较小,因为只有内容发生变化(因为背景将保持不变)。

    现在,如果 Activity 不仅仅是一个容器,而是显示它自己的内容,您仍然可以通过引入第三个(全屏,不透明) fragment 作为额外层来实现与上面相同的效果,以在切换时隐藏底层 Activity全屏 fragment 。这样做时只需将模糊层留在原处,并在返回 Activity 内容时将其关闭。

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

关于android - 如何在不显示父 Activity 的情况下用另一个全屏对话框 fragment 替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25516119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com