这是我参与「第四届青训营 」笔记创作活动的第15天。
什么是Fragment
Fragment是一种可嵌入在Activity当中的UI片段,需要依赖于Activity,能够让程序更加合理利用屏幕空间,简单来说,就是一个迷你型的Activity。
为什么有Fragment
设计的的初衷是为了适配各式各样的设备,不同设备屏幕尺寸不同,Fragmen的出现能做到一个App可以同时适应手机和平板。
Fragment优点
- Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
- 可以将Activity分离成多个可重用的组件,不需要把代码都写到Activity中,且每个Fragment都有自己的生命周期和UI。
- Fragment是一个独立模块,可以在Activity中动态移除和载入。
- Fragment切换更为流畅。
Fragment生命周期
类似于Activity生命周期,但比Activity更为丰富:
- Activity加载Fragment的时候,依次调用下面的方法: onAttach -> onCreate -> onCreateView -> onActivityCreate -> onStart ->onResume
- 当Fragment所在的Activity部分可见可见,但不获得焦点时转到 onPause
- 当对话框关闭,Activity又获得了焦点: onResume
- 当替换Fragment,并调用addToBackStack()将他添加到Back栈中 onPause -> onStop -> onDestoryView !!注意,此时的Fragment还没有被销毁。
- 如果我们替换后,在事务commit之前没有调用addToBackStack() 方法将 Fragment添加到back栈中的话;又或者退出了Activity的话,那么Fragment将会被完全结束, Fragment会进入销毁状态 onPause -> onStop -> onDestoryView -> onDestory -> onDetach
- 当按下键盘的回退键,Fragment会再次显示出来: onCreateView -> onActivityCreate -> onStart -> onResume
Fragment使用方法
创建Fragment
- 新建一个自己的Fragment类继承Fragment
- 重写
onCreateView方法,并通过inflater绑定布局文件
class MyFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_my, container, false)
}
}
在Activity中添加Fragment
使用supportfragmentManager,在Activity中需要有Fragment布局容器
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
val myFragment = MyFragment()
// 判断不同的fragment
fragmentTransaction.add(R.id.appFragment, myFragment)
fragmentTransaction.commit()
fragmentTransaction.add()方法添加Fragment,第一个参数为布局容器资源,第二个参数为Fragment类。
一个Activity实现多个Fragment切换
- 按照上述方式创建多个Fragment
- 新建一个ViewPager类,继承
FragmentStateAdapter类,重写getItemCount和createFragment方法
class ViewPagerAdapter(fragmentActivity: FragmentActivity, private var totalCount: Int) :
FragmentStateAdapter(fragmentActivity) {
override fun getItemCount(): Int {
return totalCount
}
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> HomeFragment()
1 -> MovieFragment()
else -> MovieFragment()
}
}
}
- 在Activity中绑定Adapter
@AndroidEntryPoint
class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main) {
@get:VisibleForTesting
internal val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
onTransformationStartContainer()
super.onCreate(savedInstanceState)
val myFragmentActivity: FragmentActivity = this
binding {
vm = viewModel
adapter = ViewPagerAdapter(myFragmentActivity, 2)
}
}
}
总结
Fragment比Activity更为的轻量,切换更为便捷,在开发过程中,可以尽可能多使用Fragment,使程序更为的流畅。