在最近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没有再次收到回调吗?提前感谢。
2条答案
按热度按时间x9ybnkn61#
相同的行为,请再次使用Activity.onAttachFragment或Fragment.onAttachFragment
我想,这是一个bug。我们需要发布一个问题
vmjh9lq92#
我也遇到过类似的问题,配置更改没有触发我的
FragmentOnAttachListener
,但重新开始Activity就没问题了。在我的例子中,这是因为我先调用了super.onCreate(savedInstanceState)
,然后才将侦听器注册到FragmentManager
。对super
的调用会在内部重新创建并附加任何旧的附加片段,因此,我的听众从来没有得到调用的第二次左右。我能够让事情再次工作,推迟调用super
后,刚刚我的getSupportFragmentManager().addFragmentOnAttachListener()
。作为参考,下面是从
super.onCreate
一直到调度的堆栈跟踪,该调度在恢复旧状态时调用任何侦听器,但当时我还没有添加自己的侦听器:你到底是如何刷新你的片段来触发另一个onAttach的呢?