1. FragmentTransaction區(qū)別add和replace
-
源碼中關(guān)于add的解釋
截屏2023-03-08 14.40.59.png -
源碼中關(guān)于replace的解釋
截屏2023-03-08 14.45.13.png
和明顯,add是把fragment添加到容器中,replace是如果容器中有相同fragment的話,會先移除然后再添加,另外,如果使用add的話,需要配合hide一起使用,生命周期也會有很大不同當(dāng)使用replace的時候,onResume(),onPause(),onStop()這幾個方法會走一次之前的fragment,使用返回鍵的時候,onViewCreated()和onResume()也會執(zhí)行之前add進去的fragment,而使用add和hide()的時候,只會執(zhí)行當(dāng)前fragment的方法,不會執(zhí)行之前fragment的生命周期
2.addToBackStack()這個方法是返回之前fragment的回退棧
下面是一個acitcity中添加多個fragment的代碼:
class ThreeActivity : AppCompatActivity() {
private var TAG="TAG"
private lateinit var binding: ActivityThreeBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding=ActivityThreeBinding.inflate(layoutInflater)
setContentView(binding.root)
initView()
}
private fun initView(){
val fragmentOne=FragmentOne()
supportFragmentManager.beginTransaction().replace(R.id.lv_fragment_container,fragmentOne).commit()
binding.btBack.setOnClickListener {
onBackPressed()
}
}
}
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount<=0){
finish()
}else{
supportFragmentManager.popBackStack()
}
}
fragment 的代碼
class FragmentOne:Fragment() {
private var TAG="TAG"
private lateinit var binding: FragmentThreeBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding=FragmentThreeBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvTitle.text="FragmentOne"
binding.btNext.setOnClickListener {
val fragmentTwo=FragmentTwo()
val fragmentTransaction = parentFragmentManager.beginTransaction()
fragmentTransaction.addToBackStack(null)
fragmentTransaction.replace(R.id.lv_fragment_container,fragmentTwo)
fragmentTransaction.commit()
}
}
}
class FragmentTwo:Fragment() {
private var TAG="TAG"
private lateinit var binding: FragmentThreeBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding=FragmentThreeBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvTitle.text="FragmentTwo"
binding.btNext.setOnClickListener {
val fragmentTwo=FragmentThree()
val fragmentTransaction = parentFragmentManager.beginTransaction()
fragmentTransaction.addToBackStack(null)
fragmentTransaction.replace(R.id.lv_fragment_container,fragmentTwo)
fragmentTransaction.commit()
}
}