Fragment初探
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初探的更多相关文章
- Android Fragment初探:静态Fragment组成Activity
一直习惯了在Activity中写所有事件处理代码,直到认真学习Fragment时,才发现,Activity完全可以由多个Fragment组成. 对Fragment的了解还不够深入,先从静态Fragme ...
- Android Fragment完全解析
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...
- ViewPager+Fragment再探:和TAB滑动条一起三者结合
Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...
- Android Fragment完全解析,关于碎片你所需知道的一切
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...
- Android Fragment完全解析,关于碎片你所需知道的一切 (转)。
我们都知道,Android上的界面展示都是通过Activity实现的,Activity实在是太常用了,我相信大家都已经非常熟悉了,这里就不再赘述. 但是Activity也有它的局限性,同样的界面在手机 ...
- Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml(转)
注明:这个转的,见谅未能标明原始出处 我们都知道,Android上的界面展示都是通过Activity实现的,Activity实在是太常用了,我相信大家都已经非常熟悉了,这里就不再赘述. 但是Activ ...
- Android系列之Fragment(一)----Fragment加载到Activity当中
Android上 的界面展示都是通过Activity实现的,Activity实在是太常用了.但是Activity也有它的局限性,同样的界面在手机上显示可能很好看, 在平板上就未必了,因为平板的屏幕非常 ...
- Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml
Android开发:碎片Fragment完全解析 为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像 Activi ...
- 二、fragment使用
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...
随机推荐
- 【算法笔记】A1054 The Dominant Color
1054 The Dominant Color (20 分) Behind the scenes in the computer's memory, color is always talked ...
- 毫秒查询9位数qq号码是否存在-BitMap算法应用
实现详情请查看博客园 https://www.cnblogs.com/caoke/p/10793885.html 随机注册10万个放入BitMap,然后查询qq号码是否已存在,算法复杂度O(1). / ...
- Q138 复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入: {"$id":"1",& ...
- SQL中动态进行行转列
课程表 CREATE TABLE [dbo].[demo_Course]( [Cid] [uniqueidentifier] NOT NULL, ) NULL, CONSTRAINT [PK_demo ...
- [Xamarin.Android]使用SqliteNET (转帖)
Xamarin除了提供ADO.NET方式操作Sqlite外, 也提供了一個類似Entity Framework的SqliteNET, 可至官網提供的連結下載Source, 或點選這裡下載. 以下範例使 ...
- javascript中Function与Object
1. 先来一段代码: console.log(Function); // function Function() { [native code] } console.log(Object); // f ...
- 关于javascript的各种高宽
- SecureCRTPortable的安装和使用(图文详解)
不多说,直接上干货! 玩玩这个远程连接软件,是个绿色软件. 别人已经做好了的. 解压之后, 下面,软件展示下, 这会默认去打开, 为了,方便,使用,放到桌面,作为快捷方式 成功 欢迎大家,加入我的微信 ...
- Eclipse/MyEclipse如何快速提取变量(最强帮手)
不多说,直接上干货! Eclipse里如何快速提取变量? 按alt+shift+l MyEclipse里如何快速提取变量? 按alt+shift+l 成功!快速提取变量 扩展学习 Eclipse/My ...
- 几个用Python实现的简单算法
一.算法题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源 ...