Fragment是什么

Fragment是一种可以嵌入在Activity当中的UI片段。你可以将Fragment理解成一个迷你型的Activity,虽然这个迷你型的Activity有可能和普通的Activity是一样大的。
解决某些问题:一个页面只能展示一个activity,如果要展示另一个的话,需要入栈和出栈。但是一个activity中可以包含很多个fragment。实现了多页面共存。

简单使用

  1. 首先为我们的fragment创建两个布局文件
    如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Button"/>
    </LinearLayout>
  2. 定义一个fragment类

    1
    2
    3
    4
    5
    6
    class RightFragment():Fragment(){

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.right_fragment,container,false)
    }
    }

    并重写他的onCreateView方法

    与actiivity类似,也很像自定义控件的创建方式。

  3. 然后在布局中引入fragment

    1
    2
    3
    4
    5
    6
    <fragment
    android:id="@+id/leftFrag"
    android:name="top.zfxt.fragmenttest.LeftFragment"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

    需要注意,他这里使用name属性来引入对应的fragment
    而在自定义控件中,直接写完整的包名来引入。

  4. 完成简单使用

动态引入fragment

修改activity中的方法,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
replaceFragment(AnotherRightFragment())
}
replaceFragment(RightFragment())
}
private fun replaceFragment(fragment: Fragment){
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.rightLayout,fragment)
transaction.commit()
}

其大致为:
(1) 创建待添加Fragment的实例。
(2) 获取FragmentManager,在Activity中可以直接调用getSupportFragmentManager()
方法获取。
(3) 开启一个事务,通过调用beginTransaction()方法开启。
(4) 向容器内添加或替换Fragment,一般使用replace()方法实现,需要传入容器的id和待添
加的Fragment实例。
(5) 提交事务,调用commit()方法来完成。

fragment添加到返回栈

只需要在事务执行时,添加一行
transaction.addToBackStack(null)
一般默认为null,这样子,fragment也在返回栈中,点击back后,会退回一个返回栈内容。

fragment和activity交互

activity获取fragment的实例:
Fragment提供了一个supportFragmentManager,activity通过这个管理器,然后调用findViewById,可以获取到Fragment的具体view然后操作。
fragment获取activity实例:
它内置了一个getActivity()方法,可以获取。
fragment和fragment交互:通过activity中转

Fragment声明周期

他的声明周期与activity很像。当activity处于暂停时,与之关联的fragment也会暂停。fragment除了有和activity几乎一样的回调方法外,还有一些附加的回调方法

方法 解释
onAttach() 当Fragment和Activity建立关联时调用。
onCreateView() 为Fragment创建视图(加载布局)时调用。
onActivityCreated() 确保与Fragment相关联的Activity已经创建完毕时调用。
onDestroyView() 当与Fragment关联的视图被移除时调用。
onDetach() 当Fragment和Activity解除关联时调用。

动态加载布局

让系统根据屏幕尺寸自动适配使用什么布局,主要是下面这张表

然后通过在res下建立对应的目录:如layout-small,drawable-xxhdpi之类的。
如果需要设置更具体的大小限制。可以使用最小宽度限定符(smallest-widthqualifier)
使用过程例如:需要设置一个大于600dp而单独使用都布局,就建立一个layout-sw600dp的目录。就是这么简单