Android中的片段事务问题
Posted
技术标签:
【中文标题】Android中的片段事务问题【英文标题】:Fragment Transaction Issue in Android 【发布时间】:2021-11-12 20:20:29 【问题描述】:我的应用中有一个片段 A。
我从片段 A 移到片段 B。
请注意,我在 Fragment A 上添加了 Fragment B(不是替换 Fragment。)
现在,当我从片段 B 回到片段 A 时,我必须调用片段 A 的方法,这就是为什么我在片段 A 的生命周期方法中调用该方法:在 onResume()强>,onViewCreated()
但是我注意到通过将 log 放入这些方法没有调用的方法意味着我没有在 logcat 中获取 Log 并且我在这两个方法中调用的方法没有执行。
可能是什么问题?谢谢。
我做的如下供大家参考:
override fun onResume()
super.onResume()
Log.e("onResume 1","onResume 1")
(activity as HomeActivity).updateToolbar(false)
setLanguageSpecificData()
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
super.onViewCreated(view, savedInstanceState)
Log.e("onViewCreated","onViewCreated")
setLanguageSpecificData()
【问题讨论】:
这可能是由于 FragmentA 停留在屏幕上并且没有调用onPause()
方法。分别删除顶部片段(FragmentB)后不会调用onResume()
。当你调用transaction.replace()
时,你隐藏了你的FragmentA 并且onPause()
将被调用。
【参考方案1】:
问题:
您在问题中提到的方式:
我在 Fragment A 上添加 Fragment B(不是替换 Fragment。)
因此,基于replace
和add
调用的生命周期方法之间存在差异。
如果你看看这个答案:https://***.com/a/21684520/9715339
关于fragment的生命周期事件
onPause
,onResume
,onCreateView
和其他生命周期事件将被调用,以防万一replace
但在add
的情况下不会被调用
此外,它也与活动生命周期相关。
解决方案:
查看您的代码,您想在当前可见片段更改或换句话说 backstack
更改时更新某些内容。
为此,您可以在活动中执行此操作:
supportFragmentManager.addOnBackStackChangedListener
//when backstack changes get the current fragment & do something with that info
val frg = supportFragmentManager.findFragmentById(R.id.root_container)
if (frg is AFragment)
// do something like updateToolbar(false)
else if (frg is BFragment)
//something else
Log.d("FrgTest-",frg.toString())
在fragment中你可以requireActivity().supportFragmentManager
& 休息就好了。
阅读:
这只是回栈更改的一个示例。如果您想在 Fragment 之间进行通信,您也可以使用其他方式,例如 setFragmentResultListener
。
这可能会有所帮助:https://developer.android.com/guide/fragments/communicate#kotlin
【讨论】:
另一种方法是调用HomeActivity方法,我们可以调用当前fragment的函数——fragment如果添加并且可见。以上是关于Android中的片段事务问题的主要内容,如果未能解决你的问题,请参考以下文章
如何用 ViewPager 中的另一个片段替换 Android 片段?
Android 4.4 — 半透明状态/导航栏 — fitSystemWindows/clipToPadding 不能通过片段事务工作