这是我参与「第四届青训营 」笔记创作活动的第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分为两步
- 写好Fragment的布局文件
- 创建继承自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();
}