Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期和UI布局。Fragment最大的优点是为不同屏幕大小创建灵活的UI。每个Fragment都是独立的模块,多个Activity可以共用一个Fragment,可以在Activity中进行Fragment的添加,删除,更换。

创建Fragment

继承Fragment类创建新的Fragment。

public class TestFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//创建或者填充Fragment的UI,并且返回
//如果这个Fragment没有UI,返回null
return inflater.inflate(R.layout.fragment_page, container, false);
}
}

Fragment不需要在Manifest中进行注册。它的生命周期依赖于它所嵌入的Activity。

Fragment生命周期

Fragment和Activity的生命周期类似,但是有自己特有的生命周期处理程序。Fragment还包含一些Callback,用来标识它父Activity之间的绑定和解绑定关系、它自己View的创建和销毁情况以及它父Activity的创建过程完成情况。

public class TestFragment extends Fragment {

    //调用该方法Fragment会被连接到它的父Activity上
@Deprecated
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
} //调用该方法Fragment会被连接到它的父Activity上
@Override
public void onAttach(Context context) {
super.onAttach(context);
//获取对context的引用
} //调用该方法进行Fragment的初始创建
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
} //创建自己的用户界面
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_page, container, false);
} //父Activity和Fragment已经创建
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//完成Fragment的初始化,尤其那些父Activity被初始化完成后或者Fragment的View被完全填充后才能做的事情
} //在可见生命周期开始时调用
@Override
public void onStart() {
super.onStart();
} //在活动周期开始时调用
@Override
public void onResume() {
super.onResume();
} //在活动生命周期结束时调用
@Override
public void onPause() {
super.onPause();
} //保存UI状态
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//outState会传递给onCreate、onCreateView和onActivityCreate方法中
} //在可见生命周期结束时调用
@Override
public void onStop() {
super.onStop();
} //当Fragment的View被分离时,调用
@Override
public void onDestroyView() {
//清除资源相关的View
super.onDestroyView();
} //在整个生命周期结束时调用该方法
@Override
public void onDestroy() {
//清除所有资源,结束线程和关闭数据库连接等
super.onDestroy();
} //当Fragment从它的父Activity上分离时,调用该方法
@Override
public void onDetach() {
super.onDetach();
}
}

Activity管理Fragment

每一个Activity都包含一个FragmentManager来管理它所包含的Fragment。可以通过使用getFragmentManager或者getSupportFragmentManager()来访问FragmentManager:

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentManager提供很多方法来访问Fragment,通过执行FragmentTransaction来添加、删除和替换Fragment。

静态添加

在Activity布局文件中使用fragment标签来包含要添加的fragment:

<fragment
android:name="com.fengwei23.PageFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

动态添加

在Activity的布局文件中使用FrameLayout来当作Fargment的容器:

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

然后在Activity中使用FragmentTransaction来创建相应的Fragment,并添加到对应的容器中:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
PageFragment pageFragment = new PageFragment();
fragmentTransaction.add(R.id.fl_container,pageFragment);
//指定动画
//可以添加到回退栈中
fragmentTransaction.commit();

添加、替换和删除Fragment

添加:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
PageFragment pageFragment = new PageFragment();
fragmentTransaction.add(R.id.fl_container,pageFragment);
fragmentTransaction.commit();

替换:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
PageFragment pageFragment = new PageFragment();
fragmentTransaction.replace(R.id.page_fragment,pageFragment);
fragmentTransaction.commit();

删除:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
PageFragment pageFragment = fragmentManager.findFragmentById(R.id.page_fragment);
fragmentTransaction.remove(pageFragment);
fragmentTransaction.commit();

查找Fragment

通过XML布局方式把Fragment加到Activity中,使用fragmentManager.findFragmentById(R.id.page_fragment)查找。如果添加的Fragment有加入TAG,可使用fragmentManager.findFragmentByTag(FRAGMENT_TAG)

Fragment Back栈

Fragment的回退栈类似于Activity的栈,当想要管理Fragment的时候可以使用fragmentTransaction.addToBackStack(tag),这样在可见的Fragment返回时会回到上一个可见的Fragment。

FragmentTransaction加载动画

使用fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)可以添加过渡动画、使用fragmentTransaction.setCustomAnimations()可以添加自定义动画。

Fragment和Activity交互

Fragment获得Activity的引用:getActivity(),Fragment传递事件给Activity可以使用接口回调等。

Fragment初探的更多相关文章

  1. Android Fragment初探:静态Fragment组成Activity

    一直习惯了在Activity中写所有事件处理代码,直到认真学习Fragment时,才发现,Activity完全可以由多个Fragment组成. 对Fragment的了解还不够深入,先从静态Fragme ...

  2. Android Fragment完全解析

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...

  3. ViewPager+Fragment再探:和TAB滑动条一起三者结合

    Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...

  4. Android Fragment完全解析,关于碎片你所需知道的一切

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...

  5. Android Fragment完全解析,关于碎片你所需知道的一切 (转)。

    我们都知道,Android上的界面展示都是通过Activity实现的,Activity实在是太常用了,我相信大家都已经非常熟悉了,这里就不再赘述. 但是Activity也有它的局限性,同样的界面在手机 ...

  6. Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml(转)

    注明:这个转的,见谅未能标明原始出处 我们都知道,Android上的界面展示都是通过Activity实现的,Activity实在是太常用了,我相信大家都已经非常熟悉了,这里就不再赘述. 但是Activ ...

  7. Android系列之Fragment(一)----Fragment加载到Activity当中

    Android上 的界面展示都是通过Activity实现的,Activity实在是太常用了.但是Activity也有它的局限性,同样的界面在手机上显示可能很好看, 在平板上就未必了,因为平板的屏幕非常 ...

  8. Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml

    Android开发:碎片Fragment完全解析   为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像 Activi ...

  9. 二、fragment使用

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...

随机推荐

  1. Jenkins 源代码编译

    最近一直想写一个关于 Jenkins 管理的 InelliJ 插件,但是尝试很多次总是在登录认证上面失败,各种办法都不起作用,而且官方的文档含糊不清,就动起了从源代码编译在开发环境中进行调试. 废话少 ...

  2. 在windows上添加cygwin右键

    来了一台新机器,装环境的时候,突然想直接在右键使用cygwin. 查了一些教程,基本大同小异,也算是有用,先贴一个链接: https://blog.csdn.net/yang_hong_/articl ...

  3. (转)ELK原理与介绍

    原文:https://www.cnblogs.com/aresxin/p/8035137.html 为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己 ...

  4. (转)rsync+inotify实时同步

    原文:http://lxw66.blog.51cto.com/5547576/1331048 声明:rsync inotify 需要逆向思考,当只做rsync不实时同步时,我们一般是从rsync服务端 ...

  5. PHPStorm操作小技巧

    1.围绕选中字符输入引号或者括号 2.设置服务器部署 3.隐藏Project快捷键 Shift + Esc 4.IDE内窗口切换 Ctrl + TAB 5.关闭当前项目 File -> Clos ...

  6. Normalize.css – HTML5-ready 的css重置样式集

    Normalize.css 是一个可定制的 css文件,使浏览器呈现的所有元素,更一致和符合现代标准.它正是针对只需要统一的元素样式.该项目依赖于研究浏览器默认元素风格之间的差异,精确定位需要重置的样 ...

  7. linux mint 19 与windows时间不同步

    首先确定时间无误 sudo apt-get install ntpdate sudo ntpdate time.windows.com 2 sudo hwclock --localtime --sys ...

  8. CentOS6.4安装OpenSSL

    1.下载 wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz 2.解压 tar zxf openssl-1.0.2h.tar.gz cd ...

  9. python笔记02-----字符串操作

    python中定义变量的字符串 str1 = "www"      #str1就是字符串了 一定用引号 或者直接使用"字符串."来调用内部的方法 1.字符串大小 ...

  10. 查看windows系统块大小

    C:\Users\xyw>fsutil fsinfo ntfsinfo 用法 : fsutil fsinfo ntfsinfo <volume pathname> 例如 : fsut ...