FragmentOnAttachListener在片段连接到其宿主后并非每次都被调用

3
在最近的安卓谷歌变更中,Fragment的1.3.0版本还添加了一个新的FragmentOnAttachListener接口,以取代不够灵活的onAttachFragment方法。正如文档所述:

此方法已被弃用。监听附加的片段的职责已移交给FragmentManager。您可以通过在构造函数中调用FragmentManager.addFragmentOnAttachListener(FragmentOnAttachListener)将侦听器添加到此Activity的FragmentManager中,以在片段直接附加到Activity的FragmentManager时获取回调。

因此,我在BaseActivity类的onCreate()方法中实现了此侦听器,该类是我所有活动的扩展。
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


        _binding = getViewBinding()
        setContentView(_binding!!.root)

        val fm = supportFragmentManager

        val listener = FragmentOnAttachListener {
                fragmentManager, fragment ->
            // Respond to the fragment being attached.
            
        }

        fm.addFragmentOnAttachListener(listener)

    }

源文件解释:

用于在 Fragment.onAttach(Context) 后立即接收回调的监听器。这可以用于在子片段附加或片段经历 Fragment.onCreate(Bundle) 之前执行任何其他设置/提供片段可能需要的任何依赖项。在片段附加到其主机后调用。这是在 Fragment.onAttach(Context) 被调用之后,但在任何子片段上调用 Fragment.onAttach(Context) 之前立即调用的。

在 MainActivity 中,我使用导航组件设置了 ButtomNavigationView。问题是当应用程序第一次运行时,会调用 fragments onAttach(),此监听器会在 onAttach() 之前立即接收回调,但在下一次手动调用 onAttach() 时,监听器不会再次接收回调。为了明确起见,我的一个片段中有一个按钮,在其单击事件中,片段被刷新,因此 onAttach() 再次被调用。发生这种情况时,FragmentOnAttachListener 不起作用。有谁能帮我解决为什么监听器不再接收回调的问题吗?提前感谢。

2个回答

0

当配置更改无法触发我的FragmentOnAttachListener,但重新启动Activity时可以时,我遇到了类似的问题。在我的情况下,是因为我首先调用了super.onCreate(savedInstanceState),然后才使用FragmentManager注册我的监听器。这次对super的调用内部重新创建并附加了任何旧的已附加片段,因此我的监听器第二次没有被调用。通过将对getSupportFragmentManager().addFragmentOnAttachListener()的调用推迟到刚刚之后再调用super,我成功地让一切正常工作。

供参考,这里是从super.onCreate一直到恢复旧状态时调用任何侦听器的分派的堆栈跟踪,但在那时我还没有添加自己的监听器:

dispatchOnAttachFragment:3266, FragmentManager
performAttach:3068, Fragment
attach:464, FragmentStateManager
moveToExpectedState:254, FragmentStateManager
moveToExpectedState:113, FragmentStore
moveToState:1424, FragmentManager
dispatchStateChange:2968, FragmentManager
dispatchCreate:2875, FragmentManager
dispatchCreate:252, FragmentController
onCreate:220, FragmentActivity
onCreate:77, MyActivity  // calling super.onCreate(savedInstanceState);

你是如何刷新你的fragment以触发另一个onAttach方法的?


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接