fragment | 青训营笔记

101 阅读2分钟

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

Fragment组件

概述

Fragment 表示应用界面中可重复使用的一部分。Fragment 定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。Fragment 不能独立存在,而是必须由 Activity 或另一个 Fragment 托管。**Fragment 的视图层次结构会成为宿主的视图层次结构的一部分,或附加到宿主的视图层次结构。

使用fragment的一个目的是模块化, 即使用fragment将屏幕分为好几块, 每一块做各自事情, 这样就在一个Activity上形成了好几个模块, 各模块管理一部分的内容.

因此fragment可以看作小型的Activity, 或者是Activity的片段.

您可以在同一 Activity 或多个 Activity 中使用同一 Fragment 类的多个实例,甚至可以将其用作另一个 Fragment 的子级。考虑到这一点,您应只为 Fragment 提供管理它自己的界面所需的逻辑。您应避免让一个 Fragment 依赖于另一个 Fragment 或从一个 Fragment 操控另一个 Fragment。

创建Fragment

创建Fragment分为两步

  1. 写好Fragment的布局文件
  2. 创建继承自Fragment的类, 并加载布局文件
  • 创建了一个简单布局文件, 文件名为fragment_test.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FragmentTest">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>
  • 自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象
public class FragmentTest extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_test, container, false);
    }
}

在Activity中加载Fragment

即在Activity中显示Fragment 分为静态加载和动态加载

静态加载

即在Activity的布局文件中通过fragment标签写入Fragment的信息

<fragment
    android:name="com.trudbot.mybutton.FragmentTest"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_test"/>

要注意的是, 必须设置name和id, name值为Fragment类文件的相对路径.

使用静态绑定后, Activity被渲染时会自动加载fragment, 且是固定的占用Activity的一块空间, 运行时无法改变或删除

动态加载

在Activity布局文件中定义用于存放fragmet的容器, 然后通过编程把某个fragment放入容器内.

在Activity布局文件中定义容器

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/frameLayout"/>

将fragment放入容器

分为四步

  • 获得FragmentManager对象(fm)
  • 调用fm的方法获得FragmentTransaction对象(fts)
  • 调用fts的方法将fragment放入容器中
  • 调用fts的commit方法提交

如把代码放入一个按钮的方法里, 当按钮被按下时对应fragment就被放入容器

public void MyClick(View view) {

    //也可以用getFragmentManager
    FragmentManager fm = getSupportFragmentManager();
    
    FragmentTransaction fts = fm.beginTransaction();
    
    //replace(容器id, fragment实例), 用传入的fragment替换原来容器内的fragment
    //这一步也可以用add, 将fragment加到栈顶, 这样按回退时会返回上一次的fragment
    fts.replace(R.id.frameLayout, new FragmentTest());
    
    fts.commit();
}

fragment生命周期