关于Fragment的方方面面
来源:互联网 发布:mac口红官网价格多少 编辑:程序博客网 时间:2024/05/21 07:05
简介
Fragment相当于是一种特殊的Activity,它需要被嵌套到Activity上面才能起作用,那么对于大屏设备(如:平板)就就可以考虑在一个Activity上面放置多个Fragment,这样可以充分利用屏幕面积,而且也可以更方便用户进行交互操作,当然在手机上面也可以方便的使用它,有了Fragment,我们的APP可以针对平板或是手机做不同的适配。Fragment是在Android3.0(API level 11)版本引入的,如果你使用的是之前的系统,需要先导入android-support-v4的jar包。
先看下Fragment的生命周期吧:
可以看出跟Activity很像,只是多了几个方法,单独说明一下:
onAttach()当fragment被绑定到activity时被调用
onCreateView()
创建fragment布局时被调用
onActivityCreated()
当activity的onCreate()方法返回时被调用
onDestroyView()
移除fragment的布局时被调用,跟onCreateView()对应
onDetach()
当fragment跟activity解除关联时被调用,跟onAttach()对应
因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。当Activity在活动状态时,可以独立控制Fragment的状态,比如添加或者移除Fragment。当处理一个fragment事务时, 可以将它添加到activity所管理的back stack -- 每一个activity中的back stack实体都是一个发生过的fragment事务的记录. back stack允许用户通过按下 BACK 按键从一个fragment回退到上一个fragment。
Fragment加载有两种方式:静态和动态。
先看下静态加载:
public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_one, container, false); return view; } }在activity_main.xml里面
<RelativeLayout 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" > <fragment android:id="@+id/id_fragment_title" android:name="com.example.wdong.fragmentdemo.MyFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>然后是动态加载:
在activity_main.xml里面
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" > </LinearLayout>在MainActivity的onCreate()里面
MyFragment fragment = new MyFragment(); getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment).commit();
在使用Fragment时,常用的api有以下这些:
一、getFragmentManager()获取FragmentManager。二、FragmentManager.beginTransaction()开启一个事务,即FragmentTransaction。
三、FragmentTransaction里面有一些常用的操作:
1、add() 往Activity中添加一个Fragment
2、remove() 从Activity中移除一个Fragment,如果该Fragment没有添加到back stack,那么它将被销毁
3、replace() 替换一个Fragment,其实就是remove()+add()
4、hide() 隐藏一个Fragment
5、show() 显示之前隐藏的Fragment
6、detach() 会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
7、attach() 重建view视图,附加到UI上并显示
8、commit() 提交一个事务
管理Fragment的back stack(回退栈)
有时候,我们可能有这样的需要:按返回键回到上一个Fragment,那么这时就要用到back stack了。
用法很简单,比如在FragmentOne里面有一个按钮,被按下的话,就执行下面的语句:
FragmentTwo two = new FragmentTwo(); FragmentManager fm = getFragmentManager(); FragmentTransaction tx = fm.beginTransaction(); tx.replace(R.id.id_content, two, "two");//tx.hide(this); //tx.add(R.id.id_content , two, "two"); //这种方式的话FragmentOne的视图层就不会被销毁了tx.addToBackStack(null); tx.commit();这样就跳转到了FragmentTwo,由于我们加了tx.addToBackStack(null),所以再按back键,就会回到FragmentOne。
需要说明的是:replace是remove和add的合体,如果不添加事务到回退栈,前一个Fragment实例(FragmentOne)会被销毁。但这里我们调用tx.addToBackStack(null);将当前的事务添加到了回退栈,所以FragmentOne实例不会被销毁,但是视图层次依然会被销毁,即会调用onDestoryView和onCreateView。
与Activity通信
通过getActivity()得到Fragment所关联的Activity,然后就可以获取Activity(及与Activity有关联的Fragment)布局里面的控件。
View listView = getActivity().findViewById(R.id.list);同样地,activity可以通过从FragmentManager获得一个到Fragment的引用来调用fragment中的方法,使用findFragmentById() 或 findFragmentByTag()。
MyFragment fragment =(MyFragment) getFragmentManager().findFragmentById(R.id.my_fragment);
4 0
- 关于Fragment的方方面面
- 关于Vista的方方面面
- 关于数据库连接池的方方面面
- 关于Vista的方方面面(上)
- 关于Vista的方方面面(下)
- 初学者应该知道的关于StdAfx.h的方方面面
- 一篇文章告诉你关于NFC的方方面面
- 软件缺陷的方方面面
- 窥透Fortran的方方面面
- Windows编程的方方面面
- 按钮设计的方方面面
- 测试的方方面面
- <IMG>标签的方方面面
- WebRTC学习的方方面面
- GCD的方方面面
- HTTP Headers 的方方面面
- 深入浅出Block的方方面面
- 深入浅出Block的方方面面
- java关键字this、super的用法
- C++ 用函数 泰勒公式求 sinx 的 cosx 值
- 过 DNF TP 驱动保护(二)
- 51nod1685:第K大区间2
- 通过日期获取年龄 extjs
- 关于Fragment的方方面面
- 基因数据处理46之cloud-scale-bwamem安装(compile.pl安装没问题)
- Netbeans学习总结
- 后缀自动机总结
- myeclipse中项目的展示为包格式,文件格式设置
- Codeforces Round #355 (Div. 2) A. Vanya and Fence (水题)
- KeepAlive
- Android进化史
- java类与对象_思维导图总结3