【问题标题】:Dismissing dialog and showing new one shortly shows underlying fragment before opening new dialog关闭对话框并显示新对话框在打开新对话框之前显示底层片段
【发布时间】:2019-05-30 05:10:34
【问题描述】:

我目前有一个显示对话片段的片段,当我按下对话片段上的按钮时,我想显示另一个对话片段。在我的第一个对话框片段中,我有以下方法:

 fun showSecondDialog() {
    dismiss()
    SecondDialog().showDialog(targetFragment!!)
}

showDialog() 看起来像这样:

    fun showDialog(fragment: Fragment) {
    val fragmentManager = fragment.fragmentManager
    val ft = fragmentManager!!.beginTransaction()
    val prev = fragmentManager.findFragmentByTag(getName())
    if (prev != null) {
        ft.remove(prev)
    }
    ft.addToBackStack(null)

    setTargetFragment(fragment, 0)
    show(ft, getName())
}

问题是,关闭对话框会立即生效,但在显示新对话框之前有一个间隙,我的底层片段完全可见,这会导致不希望的闪烁。

如何立即显示第二个对话框,或者如何知道它何时打开,以便我可以关闭第一个?

【问题讨论】:

    标签: android kotlin dialogfragment


    【解决方案1】:

    我也遇到了同样的问题,但是如果它符合您的要求,您可以尝试这样的解决方法:

    fun showSecondDialog() {
    
        SecondDialog().showDialog(targetFragment!!)
    
        Handler().postDelayed({ dismiss() }, 1000)
    
    }
    

    【讨论】:

    • 不起作用,因为 dismiss() 会关闭我的两个对话框
    • 我认为不可能关闭你的两个对话框,只需验证你的函数调用了两次?
    • dismiss() 方法内部调用 this.getFragmentManager().popBackStack(this.mBackStackId, 1);这将清除在被解除的原始片段之后添加的所有其他片段。
    • 好的,所以问题是我的 showDialog 使用 show(fragmentTransaction, TAG) 而不是 show(fragmentManager, TAG)。切换到第二个选项有帮助,您的建议是一个可行的选择。即使我会使用应该在显示第二个对话框后执行的 runnable,而不是随机的 1000 毫秒
    • 其实不是因为我使用了show(fragmentTransaction, TAG),而是因为我使用了ft.addToBackStack(null) 导致了这个效果。
    【解决方案2】:

    Google 建议所有片段的膨胀、替换、关闭……都应该在父 Activity 中完成,并且任何片段都不应该知道任何其他片段的任何信息。这样,片段就可以像最初设计的那样被重用。

    【讨论】:

    • 如果我将代码移动到活动中,我仍然有同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2011-07-20
    相关资源
    最近更新 更多