Android开发之Fragment

244 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第15天。

什么是Fragment

Fragment是一种可嵌入在Activity当中的UI片段,需要依赖于Activity,能够让程序更加合理利用屏幕空间,简单来说,就是一个迷你型的Activity。

为什么有Fragment

设计的的初衷是为了适配各式各样的设备,不同设备屏幕尺寸不同,Fragmen的出现能做到一个App可以同时适应手机和平板。

Fragment优点

  • Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
  • 可以将Activity分离成多个可重用的组件,不需要把代码都写到Activity中,且每个Fragment都有自己的生命周期和UI。
  • Fragment是一个独立模块,可以在Activity中动态移除和载入。
  • Fragment切换更为流畅。

Fragment生命周期

类似于Activity生命周期,但比Activity更为丰富:

image.png

  • 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类,重写getItemCountcreateFragment方法
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,使程序更为的流畅。