【背上Jetpack之Fragment】你真的会用Fragment吗?Fragment常见问题以及androidx下Fragment的使用新姿势

本文探讨Fragment的常见问题,包括getSupportFragmentManager等方法的区别、FragmentTransaction的使用、LiveData的观察者选择,以及在AndroidX环境下Fragment的新特性。同时,概述了Fragment在BottomBarNavigation和drawer中的应用,强调了Android开发中的架构、性能优化和多平台开发的重要性。
摘要由CSDN通过智能技术生成

Fragment 常见的问题

  • getSupportFragmentManager , getParentFragmentManager 和 getChildFragmentManager

  • FragmentStateAdapter 和 FragmentPagerAdapter

  • add 和 replace

  • observe LiveData时传入 this 还是 viewLifecycleOwner

  • 使用 simpleName 作为 fragment 的 tag 有何风险?

  • 在 BottomBarNavigation 和 drawer 中如何使用Fragment多次添加?

  • 返回栈

getSupportFragmentManager , getParentFragmentManager和getChildFragmentManager

FragmentManagerandroidx.fragment.app(已弃用的不考虑)下的抽象类,创建用于 添加,移除,替换 fragment 的事务(transaction

首先要确认一件事,getSupportFragmentManager()FragmentActivity下的方法

getParentFragmentManagergetChildFragmentManagerandroidx.fragment.app.Fragment 下的方法,

其中 androidx.fragment 1.2.0getFragmentManagerrequireFragmentManager 已弃用

明确了这件事,接下来的就很清晰了

  • getSupportFragmentManageractivity关联,可以将其视为 activityFragmentManager
  • getChildFragmentManagerfragment关联,可以将其视为fragmentFragmentManager
  • getParentFragmentManager情况稍微复杂,正常情况返回的是该fragment 依附的activityFragmentManager。如果该fragment是另一个fragment 的子 fragment,则返回的是其父fragmentgetChildFragmentManager

如果这么说还不明白的话,我们可以做一个实践。

创建一个 activity,一个父fragment ,一个子fragment

// activity
class MyActivity : AppCompatActivity(R.layout.activity_main) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager.commit {
            add<ParentFragment>(R.id.content)
        }
        Log.i("MyActivity", "supportFragmentManager $supportFragmentManager")
    }
}

class ParentFragment : Fragment(R.layout.fragment_parent) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        childFragmentManager.commit {
            add<ChildFragment>(R.id.content)
        }
        Log.i("ParentFragment", "parentFragmentManager $parentFragmentManager")
        Log.i("ParentFragment", "childFragmentManager $childFragmentManager")
    }
}

class ChildFragment : Fragment(R.layout.fragment_child) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Log.i("ChildFragment", "parentFragmentManager $parentFragmentManager")
        Log.i("ChildFragment", "childFragmentManager $childFragmentManager")
    }
} 

//log
I/MyActivity: supportFragmentManager FragmentManager{825dcef in HostCallbacks{14a13fc}}}
I/ParentFragment: parentFragmentManager FragmentManager{825dcef in HostCallbacks{14a13fc}}}
I/ParentFragment: childFragmentManager FragmentManager{df5de83 in ParentFragment{7cdd800}}}
I/ChildFragment: parentFragmentManager FragmentManager{df5de83 in ParentFragment{7cdd800}}}
I/ChildFragment: childFragmentManager FragmentManager{aba9afb in ChildFragment{5cea718}}}


因此

*   在 `activity` 中使用 `ViewPager`,`BottomSheetFragment` 和`DialogFragment` 时,都应使用 `getSupportFragmentManager`
    
*   在`fragment` 中使用 `ViewPager` 时应该使用`getChildFragmentManager`
    

错误的在 `fragment` 中使用 `activity` 的 `FragmentManager` 会引发内存泄露。 为什么呢?假如您的fragment中有一些依靠 `ViewPager` 管理的子 `fragment`,并且所有这些 `fragment` 都在 `activity` 中,因为您使用的是`activity` 的`FragmentManager` 。 现在,如果关闭您的父`fragment`,它将被关闭,但不会被销毁,因为所有子`fragment`都处于活动状态,并且它们仍在内存中,从而导致泄漏。 它不仅会泄漏父`fragment`,还会泄漏所有子`fragment`,因为它们都无法从堆内存中清除。

### FragmentStateAdapter 和 FragmentPagerAdapter

`FragmentPagerAdapter`将整个 `fragment`存储在内存中,如果`ViewPager`中使用了大量 `fragment`,则可能导致内存开销增加。 `FragmentStatePagerAdapter`仅存储片段的`
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值