Android 中的碎片交易问题
Fragment Transaction Issue in Android
我的应用程序中有一个片段 A。
从片段A,我正在移动到片段B。
请注意,我是在片段 A 上添加片段 B(不是替换片段。)
现在,当我从片段 B 回到片段 A 时,我必须调用片段 A 的一个方法,这就是我在片段 A 的生命周期方法中调用该方法的原因:在 onResume 中(), onViewCreated()
但是我注意到,将日志放入这两个方法未调用的方法意味着我没有登录 logcat 并且我在这两个方法中调用的方法未执行。
可能是什么问题?谢谢
我是这样做的,供大家参考:
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()
}
问题:
您在问题中提到的方式是:
I am adding the Fragment B on Fragment A (not replacing the Fragment.)
因此,根据 replace
和 add
调用的生命周期方法之间存在差异。
如果你看一下这个答案:
In terms of fragment's life cycle events onPause
, onResume
,
onCreateView
and other life cycle events will be invoked in case of
replace
but they wont be invoked in case of add
另外,它也与 activity 生命周期有关。
解法:
查看您的代码,您希望在当前可见片段发生变化或换句话说 backstack
发生变化时更新某些内容。
为此,您可以在 activity:
中执行此操作
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
& 休息就可以了。
阅读:
这只是后台更改的一个例子。如果您想在片段之间进行通信,您也可以使用其他方式,例如 setFragmentResultListener
。
这可能有帮助:https://developer.android.com/guide/fragments/communicate#kotlin
我的应用程序中有一个片段 A。
从片段A,我正在移动到片段B。
请注意,我是在片段 A 上添加片段 B(不是替换片段。)
现在,当我从片段 B 回到片段 A 时,我必须调用片段 A 的一个方法,这就是我在片段 A 的生命周期方法中调用该方法的原因:在 onResume 中(), onViewCreated()
但是我注意到,将日志放入这两个方法未调用的方法意味着我没有登录 logcat 并且我在这两个方法中调用的方法未执行。
可能是什么问题?谢谢
我是这样做的,供大家参考:
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()
}
问题:
您在问题中提到的方式是:
I am adding the Fragment B on Fragment A (not replacing the Fragment.)
因此,根据 replace
和 add
调用的生命周期方法之间存在差异。
如果你看一下这个答案:
In terms of fragment's life cycle events
onPause
,onResume
,onCreateView
and other life cycle events will be invoked in case ofreplace
but they wont be invoked in case ofadd
另外,它也与 activity 生命周期有关。
解法:
查看您的代码,您希望在当前可见片段发生变化或换句话说 backstack
发生变化时更新某些内容。
为此,您可以在 activity:
中执行此操作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
& 休息就可以了。
阅读:
这只是后台更改的一个例子。如果您想在片段之间进行通信,您也可以使用其他方式,例如 setFragmentResultListener
。
这可能有帮助:https://developer.android.com/guide/fragments/communicate#kotlin