Android Fragment
Android Fragment(一)
Fragment官方文档(需要翻墙)
文章目录
- Android Fragment(一)
- 一、关于Fragment
- 二、Fragment生命周期
- 1.onAttach()
- 2.onCreat()
- 3.onCreateView()
- 4.onActivityCreated()
- 5.onStart()
- 6.onResume()
- 7.onPause()
- 8.onStop
- 9.onDestroyView()
- 10.onDestroy()
- 11.onDetach()
- 三、Fragment加载方式
- 1.静态加载
- 2.动态加载
一、关于Fragment
- Fragment 表示 FragmentActivity 中的行为或界面的一部分。可以在一个 Activity 中组合多个Fragment ,从而构建多窗格界面,并在多个 Activity 中重复使用某个Fragment 。可以将Fragment 视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除Fragment (这有点像可以在不同 Activity 中重复使用的“子 Activity”)。
- Fragment 必须始终托管在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。例如,当 Activity 暂停时,Activity 的所有Fragment也会暂停;当 Activity 被销毁时,所有Fragment也会被销毁。不过,当 Activity 正在运行(处于已恢复生命周期状态)时,可以独立操纵每个Fragment,如添加或移除Fragment。当执行此类片段事务时,也可将其添加到由 Activity 管理的返回栈 — Activity 中的每个返回栈条目都是一条已发生Fragment事务的记录。借助返回栈,用户可以通过按返回按钮撤消Fragment事务(后退)。
- 当将Fragment作为 Activity 布局的一部分添加时,其位于 Activity 视图层次结构的某个 ViewGroup 中,并且Fragment会定义其自己的视图布局。可以通过在 Activity 的布局文件中声明Fragment,将其作为 元素插入您的 Activity 布局,或者通过将其添加到某个现有的 ViewGroup,利用应用代码将其插入布局
二、Fragment生命周期
1.onAttach()
/*** Called when a fragment is first attached to its context.* {@link #onCreate(Bundle)} will be called after this.*/@SuppressWarnings("deprecation")@MainThread@CallSuperpublic void onAttach(@NonNull Context context) {mCalled = true;final Activity hostActivity = mHost == null ? null : mHost.getActivity();if (hostActivity != null) {mCalled = false;onAttach(hostActivity);}}/*** Called when a fragment is first attached to its activity.* {@link #onCreate(Bundle)} will be called after this.** @deprecated See {@link #onAttach(Context)}.*/@SuppressWarnings({"unused", "DeprecatedIsStillUsed"})@Deprecated@MainThread@CallSuperpublic void onAttach(@NonNull Activity activity) {mCalled = true;}
onAttach 是Fragment 生命周期的第一步,它的作用
在Fragment 和 Activity 建立关联前调用(Activity 传递到此方法内)
通常在Activity 与Fragment 是宿主关系的时候,Activity 向Fragment 传递数据的时候使用
@Overridepublic void onAttach(@NonNull Context context) {super.onAttach(context);str = ((MainActivity) context).getStr(); // activity获取数据System.out.println(str);}
2.onCreat()
/*** Called to do initial creation of a fragment. This is called after* {@link #onAttach(Activity)} and before* {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.** <p>Note that this can be called while the fragment's activity is* still in the process of being created. As such, you can not rely* on things like the activity's content view hierarchy being initialized* at this point. If you want to do work once the activity itself is* created, add a {@link androidx.lifecycle.LifecycleObserver} on the* activity's Lifecycle, removing it when it receives the* {@link Lifecycle.State#CREATED} callback.** <p>Any restored child fragments will be created before the base* <code>Fragment.onCreate</code> method returns.</p>** @param savedInstanceState If the fragment is being re-created from* a previous saved state, this is the state.*/@MainThread@CallSuperpublic void onCreate(@Nullable Bundle savedInstanceState) {mCalled = true;restoreChildFragmentState(savedInstanceState);if (!mChildFragmentManager.isStateAtLeast(Fragment.CREATED)) {mChildFragmentManager.dispatchCreate();}}
fragment初次创建时调用。尽管它看起来像是Activity的OnCreate()函数,但这个只是用来创建Fragment的。此时的Activity还没有创建完成,因为我们的Fragment也是Activity创建的一部分。
3.onCreateView()
/*** Called to have the fragment instantiate its user interface view.* This is optional, and non-graphical fragments can return null. This will be called between* {@link #onCreate(Bundle)} and {@link #onViewCreated(View, Bundle)}.* <p>A default View can be returned by calling {@link #Fragment(int)} in your* constructor. Otherwise, this method returns null.** <p>It is recommended to <strong>only</strong> inflate the layout in this method and move* logic that operates on the returned View to {@link #onViewCreated(View, Bundle)}.** <p>If you return a View from here, you will later be called in* {@link #onDestroyView} when the view is being released.** @param inflater The LayoutInflater object that can be used to inflate* any views in the fragment,* @param container If non-null, this is the parent view that the fragment's* UI should be attached to. The fragment should not add the view itself,* but this can be used to generate the LayoutParams of the view.* @param savedInstanceState If non-null, this fragment is being re-constructed* from a previous saved state as given here.** @return Return the View for the fragment's UI, or null.*/@MainThread@Nullablepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {if (mContentLayoutId != 0) {return inflater.inflate(mContentLayoutId, container, false);}return null;}
在这个fragment构造它的用户接口视图(即布局)时调用。
4.onActivityCreated()
/*** Called when the fragment's activity has been created and this* fragment's view hierarchy instantiated. It can be used to do final* initialization once these pieces are in place, such as retrieving* views or restoring state. It is also useful for fragments that use* {@link #setRetainInstance(boolean)} to retain their instance,* as this callback tells the fragment when it is fully associated with* the new activity instance. This is called after {@link #onCreateView}* and before {@link #onViewStateRestored(Bundle)}.** @param savedInstanceState If the fragment is being re-created from* a previous saved state, this is the state.** @deprecated use {@link #onViewCreated(View, Bundle)} for code touching* the Fragment's view and {@link #onCreate(Bundle)} for other initialization.* To get a callback specifically when a Fragment activity's* {@link Activity#onCreate(Bundle)} is called, register a* {@link androidx.lifecycle.LifecycleObserver} on the Activity's* {@link Lifecycle} in {@link #onAttach(Context)}, removing it when it receives the* {@link Lifecycle.State#CREATED} callback.*/@SuppressWarnings({"DeprecatedIsStillUsed", "unused"})@MainThread@CallSuper@Deprecatedpublic void onActivityCreated(@Nullable Bundle savedInstanceState) {mCalled = true;}
在Activity的OnCreate()结束后,会调用此方法。所以到这里的时候,Activity已经创建完成!在这个函数中才可以使用Activity的所有资源。
5.onStart()
/*** Called when the Fragment is visible to the user. This is generally* tied to {@link Activity#onStart() Activity.onStart} of the containing* Activity's lifecycle.*/@MainThread@CallSuperpublic void onStart() {mCalled = true;}
当到OnStart()时,Fragment对用户就是可见的了。但用户还未开始与Fragment交互。在生命周期中也可以看到Fragment的OnStart()过程与Activity的OnStart()过程是绑定的。意义即是一样的。
6.onResume()
/*** Called when the fragment is visible to the user and actively running.* This is generally* tied to {@link Activity#onResume() Activity.onResume} of the containing* Activity's lifecycle.*/@MainThread@CallSuperpublic void onResume() {mCalled = true;}
当这个fragment对用户可见并且正在运行时调用。这是Fragment与用户交互之前的最后一个回调。从生命周期对比中,可以看到,Fragment的OnResume与Activity的OnResume是相互绑定的,意义是一样的。它依赖于包含它的activity的Activity.onResume。当OnResume()结束后,就可以正式与用户交互了。
7.onPause()
/*** Called when the Fragment is no longer resumed. This is generally* tied to {@link Activity#onPause() Activity.onPause} of the containing* Activity's lifecycle.*/@MainThread@CallSuperpublic void onPause() {mCalled = true;}
此回调与Activity的OnPause()相绑定,与Activity的OnPause()意义一样。
8.onStop
/*** Called when the Fragment is no longer started. This is generally* tied to {@link Activity#onStop() Activity.onStop} of the containing* Activity's lifecycle.*/@MainThread@CallSuperpublic void onStop() {mCalled = true;}
这个回调与Activity的OnStop()相绑定,意义一样。已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()。
9.onDestroyView()
/*** Called when the view previously created by {@link #onCreateView} has* been detached from the fragment. The next time the fragment needs* to be displayed, a new view will be created. This is called* after {@link #onStop()} and before {@link #onDestroy()}. It is called* <em>regardless</em> of whether {@link #onCreateView} returned a* non-null view. Internally it is called after the view's state has* been saved but before it has been removed from its parent.*/@MainThread@CallSuperpublic void onDestroyView() {mCalled = true;}
如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。
10.onDestroy()
/*** Called when the fragment is no longer in use. This is called* after {@link #onStop()} and before {@link #onDetach()}.*/@MainThread@CallSuperpublic void onDestroy() {mCalled = true;}
当这个fragment不再使用时调用。需要注意的是,它即使经过了onDestroy()阶段,但仍然能从Activity中找到,因为它还没有Detach。
11.onDetach()
/*** Called when the fragment is no longer attached to its activity. This* is called after {@link #onDestroy()}.*/@MainThread@CallSuperpublic void onDetach() {mCalled = true;}
Fragment生命周期中最后一个回调是onDetach()。调用它以后,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。
三、Fragment加载方式
1.静态加载
MainActivity.class
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);}
}
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/staticFragment"android:name="com.lw.fgmt.ui.StaticFragment"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>
StaticFragment.java
public class StaticFragment extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {// Fragment的静态加载View view = inflater.inflate(R.layout.fragment_static, container, false);return view;}
}
fragment_static.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#00ff00"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="fragment static load"android:textColor="#000000"android:textSize="25sp"/></LinearLayout>
2.动态加载
MainActivity.java
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);if (savedInstanceState == null) {getSupportFragmentManager().beginTransaction().replace(R.id.container, MainFragment.newInstance()).commit();}}
}
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="horizontal"></LinearLayout>
MianFragment.java
public class MainFragment extends Fragment {public static Fragment newInstance() {return new MainFragment();}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.main_fragment, container, false);rootView.findViewById(R.id.btnShowAnotherFragment).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {getFragmentManager().beginTransaction().addToBackStack(null) //添加到BackStack,支持返回键后退.replace(R.id.container, AnotherFragment.newInstance()).commit();}});return rootView;}
}
main_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainFragment"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/btnShowAnotherFragment"android:text="呈现另一个Fragment"/>
</LinearLayout>
AnotherFragment.java
public class AnotherFragment extends Fragment {public static Fragment newInstance(){return new AnotherFragment();}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.another_fragment, container, false);rootView.findViewById(R.id.btnBack).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {getFragmentManager().popBackStack();}});return rootView;}
}
another_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="这是另一个Fragment"/><Buttonandroid:id="@+id/btnBack"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="后退" />
</LinearLayout>
Android Fragment相关推荐
- Android Fragment 基本介绍
Android Fragment 基本介绍 Android Fragment 基本介绍 Fragment Android是在Android 3.0 (API level 11)开始引入Fragment ...
- android Fragment 学习资料推荐
为什么80%的码农都做不了架构师?>>> android Fragment 学习资料推荐:android大神 郭霖 http://blog.csdn.net/guolin_ ...
- 【转】基于Android Fragment功能的例子
原文网址:http://blog.csdn.net/eyu8874521/article/details/8252216 通过最近空闲时候对Fragment的学习,尝试着写了一个小Demo,将在开发的 ...
- [转]Android fragment 重叠问题——通过hide,show方式导致的解决方法
[转]Android fragment 重叠问题--通过hide,show方式导致的解决方法 参考文章: (1)[转]Android fragment 重叠问题--通过hide,show方式导致的解决 ...
- 【转】 Android Fragment 真正的完全解析(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...
- Android Fragment 真正的完全解析(下)
本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragm ...
- Android Fragment嵌套导致的bug
原文链接 Android 多个Fragment嵌套导致的三大BUG Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误 http ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- Android Fragment 简单实例
Android上的界面展示都是通过Activity实现的.Activity实在是太经常使用了.我相信大家都已经很熟悉了,这里就不再赘述. 可是Activity也有它的局限性,相同的界面在手机上显示可能 ...
- android 底部通知,Android Fragment实现底部通知栏
Android Fragment实现底部通知栏,供大家参考,具体内容如下 截图如下: 1. 第一步先要创建fragment(动态注册) 然后将两个勾选取消掉(还有一种是自己手动创建) 会自动生成相对应 ...
最新文章
- 数学知识--Methods for Non-Linear Least Squares Problems(第二章)
- 流量枯竭的时代,小程序创下“神话”,打造全新商业生态!
- 数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)...
- TFTP更新linux或android系统文件
- Android中handler的使用及原理---学习笔记
- 使用LayoutAnimationController为RecyclerView添加动画
- 用c语言递归函数做扫雷,【C语言基础学习---扫雷游戏】(包含普通版+递归炼狱版)...
- [hackerrank]Closest Number
- 2019,燃烧的中国开源年
- 力扣-179 最大数
- 假设检验-统计学自学笔记
- Linux Ruby安装
- 2018年春季学期《软件工程》班级讨论群中开放性问题群聊记录
- JavaOpencv实现答题卡扫描 银行卡号码截取
- 音频的相关基础知识,这里有
- Android 中文API合集 最终版,androi中文api合集.doc
- CTP程序化交易入门系列之二:API基本架构及初始化
- 快手2020校园招聘秋招笔试--算法B试卷
- 草图大师(SketchUp)2022安装图文教程
- 计算机三级哪个实用点,考计算机三级哪个简单?哪个会实用点?
热门文章
- haproxy 503 Service Unavailable
- python素数问题_试除法解决质数问题(Python3)
- 安装SQL2019 提示“服务没有及时响应启动或控制请求”
- 001: 冷血格斗场 (有重复second时的查找方法)
- SMARTFORM 插入列、增加表格边框和底纹
- sdddddddddddddddddddddd
- poi导出word 表格 单元格内换行
- 僵尸网络攻击_僵尸网络对WordPress网站的主要暴力攻击
- python培训班全套课程网盘
- C++11的chrono总结