Android :fragment介绍
一、关于Fragmemt
1、Fragment(片段),主要是为了支持更多的动态和灵活的用户界面设计,如平板电脑。Fragment允许组合和交换用户界面组件,而不需要更改视图层次结构。通过把Activity的布局划分成Fragment,可以在运行时修改Activity的外观。
2、Fragment表示Activity中的用户界面的行为或部分。可以将多个Fragment组合在一个Activity中,并在多个活动中重用Fragment。可以把Fragment当作一个Activity的模块部分,有自己的生命周期,接受自己的输入事件。
3、一个Fragment必须始终嵌在一个Activity中,该片段的生命周期直接受宿主Activity的生命周期的影响。例如,当Activity暂停时,所有的Fragment都是这样,当Activity被破坏时,所有的Fragment都被破坏。然而,当一个Activity正在运行,可以独立操作每一个Fragment,如添加删除它们。
二、Fragment生命周期图解
1. 当一个fragment被创建的时候,它会经历以下状态.
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
2. 当这个fragment对用户可见的时候,它会经历以下状态。
- onStart()
- onResume()
3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。
- onPause()
- onStop()
4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。
- onPause()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
三、创建Fragment
要创建一个Fragment,你必须创建一个Fragment的子类(或它的一个现有的子类)。
Fragment类的代码看起来很像一个Activity。它含有类似于Activity的回调方法,如oncreate(),onstart(),onpause(),和onstop()。
事实上,如果你将一个现有的安卓应用程序转换为使用Fragment,你可能会将代码从Activity的回调方法转移到你的Fragment的相应的回调方法中。
通常,你应该至少实现以下生命周期方法:
onCreate()
当创建该Fragment时,该系统调用该。在你的实现中,你应该对你想要保留的Fragment进行初始化,然后在暂停或停止的时候,然后重新开始。
onCreateview()
该系统调用这个时候,以绘制其用户界面的第一次。要为你的Fragment绘制一个用户界面,你必须从这个方法中返回一个视图,这是你的Fragment布局的根。如果Fragment不提供用户界面,您可以返回null。
onPause()
该系统将该方法称为用户离开该Fragment(虽然并不总是意味着该Fragment被销毁);通常您应该提交当前用户所做的任何更改(因为用户可能不会回来)。
实例代码如下:
public class PhoneFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_phone, container, false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onDestroy() { super.onDestroy(); } }
四、封装BaseFragment基类
public abstract class BaseFragment extends Fragment { protected View view; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (view == null) { view = inflater.inflate(getLayoutId(), container, false); ButterKnife.bind(this, view); } return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); afterCreate(savedInstanceState); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } protected abstract int getLayoutId();//获取布局 protected abstract void afterCreate(Bundle savedInstanceState);//初始化布局 }
五、使用静态工厂方法newInstance(...)来获取Fragment实例
还有就是Fragment推荐使用setArguments来传递参数,避免在横竖屏切换的时候Fragment自动调用自己的无参构造函数,导致数据丢失。
public class SecondFragment extends BaseFragment implements View.OnClickListener { public static SecondFragment getInstance(String data){ return new SecondFragment(); } @Override protected int getLayoutId() { return R.layout.fragment_second; } @Override protected void afterCreate(Bundle savedInstanceState) { //布局初始化 } @Override public void onClick(View v) { } }
如果后一个页面不需要用到前一个页面的太多数据,推荐用Activity展示,否则最好用Fragment( 当然这也不是绝对的)。
最新文章
- jquery之css操作
- 如何在sharepoint2010中配置Google Anlytics 分析服务
- Java常用类库——Runtime
- 一个Delphi7的BUG
- mouseover 和 hover 方法
- Android开发之 android:windowSoftInputMode属性详解
- php将unicode编码转为utf-8方法
- hdu 2509 Be the Winner 博弈
- Struts2 对Action中所有方法进行输入校验、单个方法进行校验
- POJ- Find a multiple -(抽屉原理)
- hdu 2614
- 如何将解压版的tomcat设置为windows 服务启动
- Hive:子查询
- 超文本传输​​协议 - HTTP / 1.1(Hypertext Transfer Protocol -- HTTP/1.1)之方法定义(Method Definitions)
- .NET快速信息化系统开发框架 V3.2->;Web版本新增“文件管理中心”集上传、下载、文件共享等一身,非常实用的功能
- codeforces-div2-449-B
- jquery截取地址栏中url参数的值
- python递归练习:生成一个n级深度的字典,例如:[1,2,3,4,5,6] 可以生成{1: {2: {3: {4: {6: 5}}}}},写一个函数定义n级
- 2018-2019-2 网络对抗技术 20165301 Exp2 后门原理与实践
- html生成缩略图来预览解决方案