Fragment的来源和理解使用

简介: 前段时间我突然捉摸到一个问题,为什么有了Activity之后我们还要有Fragment,看起来Fragment是多余的一样,所有用Fragement实现的界面和跳转切换效果,我们都可以用Activity解决。

前段时间我突然捉摸到一个问题,为什么有了Activity之后我们还要有Fragment,看起来Fragment是多余的一样,所有用Fragement实现的界面和跳转切换效果,我们都可以用Activity解决。那么这是为什么呢?它存在一定有它存在的意义。

我在网上搜寻了一下,发现Fragment之所以出现是为了适应大屏幕的平板电脑。因为平板电脑的屏幕比手机屏幕大得多,因此可以容纳更多之间存在关系的UI组件。Fragment的到来,简化了大屏幕的UI设计,从而更方便地在运行过程中动态更新Activity的用户界面。接下来就详细地介绍一下Fragment。

首先当然是Fragment的生命周期,Fragment的生命周期中主要包含四种状态:

(1)运行状态:位于前台并且是可见的,可以获得焦点;

(2)暂停状态:和运行状态不同的是不能获取焦点,但同样位于前台并可见;

(3)停止状态:不可见并且失去焦点;

(4)销毁状态:要么是被FragmentManager调用了remove()方法,要么就是他所在的Activity调用了onDestroy()的方法,也就是完全被删除或所在Activity被销毁。具体生命周期见下图:

 

上图中还少画了一条路径,是从onDestroyView()返回到onCreateView(),该Fragment从Back栈返回到界面。上面的方法中,与Activity类似的那几个我就不说了,还有几个方法这边稍微作一下解释:

(1)onAttach():当该Fragment被添加到Activity是被回调,并且只会被调用一次。

(2)onActivityCreated():该Fragment所在Activity被启动完成时回调。

(3)onDestroyView():销毁该Fragment所包含的View时被调用。

(4)onDetach():将该Fragment从Activity中删除或者替换完成时回调,和onAttach()一样只会被调用一次。

以上就是Fragment的生命周期介绍,接下来介绍一下Fragment的继承体系,Fragment有四个子类,详见下图:


Fragment的实现和Activity很类似,它们都需要实现与Activity类似的回调方法,例如:onCreate()、onStart()、onResume()、onPause()、onStop();但是和Activity不同的是,我们在创建的时候,Activity可能只需要在onCreate()方法调用setContentView(),然后在把Activity对应的xml文件中的控件利用findViewById获取显示即可。Fragemnt需要先调用onCreate()方法,在实现代码中只初始化想要在Fragment中保持的必要组件,当Fragment调用onPause()或者onStop()方法可以恢复。而通常情况下,Fragment还要重写onCreateView(),在这个方法中返回一个View,也就是他要显示的View。代码示例如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.user_layout, container, false);
    --------------------略-------------------------------
    return view;
}
从上面的代码中我们可以看到它通过LayoutInflater加载了名为“user_layout”的布局文件,并且它返回了一个view,这个view就是上面说的Fragment要显示的View,要注意的是,当我们使用findViewById方法时一定要在前面加个“view.”,因为我们是获取这个View中的控件。

除了上面这个区别外,Fragment总是作为Activity界面的组成部分,所以它的生命周期也受到了所处在Activity的影响,Activity暂停时,它所有的Fragment也都暂停,同样地,Activity销毁时,它所有的Fragment也被销毁。它们之间也是可以相互调用的,Fragment通过getActivity()方法获取到它所在的Activity,而Activity通过调用FragmentManager中的findFragmentById()或findFragmentByTag()方法来获得Fragment。当然,除此之外,Activity还能通过调用Fragment中的add()、remove()、replace()方法动态添加、移除或者替换Fragment,这也说明一个Activity可以组装多个Fragment。

那么Activity到底是怎样实现Fragment的添加删除替换的呢?上面我们讲到了FragmentManager,从字面意思来讲也就是Fragment的管理器,确实我们需要先新建它的对象,并且利用FragmentTransaction类来对Fragment进行一系列的管理。

首先如下面的代码所示新建它们的对象:

FragmentManager mFragmentManager = getSupportFragmentManager();
FragmentTransaction ft = mFragmentManager.beginTransaction();
然后我们就可以直接调用ft.add()/show()/hide()方法来进行实现Fragment的一系列操作了。

这就是这段时间我对Fragment的学习理解和使用,有不对的地方欢迎指正。

目录
相关文章
|
7月前
|
API
Fragment简介
Fragment简介
82 0
|
7月前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
50 0
RecyclerView 的用法,添加分割线,实现自定义监听
RecyclerView 的用法,添加分割线,实现自定义监听
RecyclerView 的用法,添加分割线,实现自定义监听
|
Android开发
Android 8.1 允许安装未知来源权限/允许来自此来源的应用
Android 8.1 允许安装未知来源权限/允许来自此来源的应用
591 0
|
iOS开发
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
279 0
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
DHL
|
存储 算法 安全
[译][Google工程师] 刚刚发布了 Fragment 的新特性 “Fragment 间传递数据的新方式” 以及源码分析
[译][Google工程师] 刚刚发布了 Fragment 的新特性 “Fragment 间传递数据的新方式” 以及源码分析
DHL
187 0
[译][Google工程师] 刚刚发布了 Fragment 的新特性 “Fragment 间传递数据的新方式” 以及源码分析
|
缓存 API 索引
RecyclerView封装库和综合案例【包含25篇博客】
目录介绍 1.复杂页面库介绍 2.本库优势亮点 2.1 支持多种状态切换管理 2.2 支持添加多个header和footer 2.3 支持侧滑功能和拖拽移动 2.4 其他亮点介绍 3.如何使用介绍 3.
1831 0