android-fragments 每次将片段附加到其主机后,都不会调用FragmentOnAttachListener

4c8rllxm  于 2022-11-13  发布在  Android
关注(0)|答案(2)|浏览(187)

在最近google对android的修改中,Fragment的1.3.0版本也增加了一个新的FragmentOnAttachListener接口来代替灵活性较低的onAttachFragment方法。
此方法已弃用。侦听附加片段的责任已移到FragmentManager。您可以通过在构造函数中调用FragmentManager.addFragmentOnAttachListener(FragmentOnAttachListener)向此活动的FragmentManager添加侦听器,以便在片段直接附加到活动的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之后的回调的侦听器这可以用于执行任何附加设置/提供片段在附加子片段或片段经历片段之前可能需要的任何依赖性。onCreate(Bundle)。在片段已附加到其主机后调用。这将在Fragment.onAttach之后立即调用(Context)和Fragment.onAttach(Context)之前的任何子片段上都已调用。
在MainActivity中,我设置了带有导航组件的ButtonNavigationView。问题是当应用程序第一次运行时,onAttach碎片调用了(),则此侦听器在onAttach之前立即接收回调(),但在下次onAttach时(),侦听器不会收到回调。为了清楚起见,我在我的一个片段中有一个按钮,在它的click事件中,片段被刷新,然后再次调用Attach()。当这种情况发生时,FragmentOnAttachListener不起作用。有人能告诉我为什么listener没有再次收到回调吗?提前感谢。

x9ybnkn6

x9ybnkn61#

相同的行为,请再次使用Activity.onAttachFragment或Fragment.onAttachFragment
我想,这是一个bug。我们需要发布一个问题

vmjh9lq9

vmjh9lq92#

我也遇到过类似的问题,配置更改没有触发我的FragmentOnAttachListener,但重新开始Activity就没问题了。在我的例子中,这是因为我先调用了super.onCreate(savedInstanceState),然后才将侦听器注册到FragmentManager。对super的调用会在内部重新创建并附加任何旧的附加片段,因此,我的听众从来没有得到调用的第二次左右。我能够让事情再次工作,推迟调用super后,刚刚我的getSupportFragmentManager().addFragmentOnAttachListener()
作为参考,下面是从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);

你到底是如何刷新你的片段来触发另一个onAttach的呢?

相关问题