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。)

因此,基于replaceadd 调用的生命周期方法之间存在差异。

如果你看看这个答案: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 片段复制

Android 4.4 — 半透明状态/导航栏 — fitSystemWindows/clipToPadding 不能通过片段事务工作

在android中使用带有片段的roboguice的任何简单示例?

Android从后台堆栈中删除事务

Android:使用支持片段管理器时复制片段