文档章节

关于Fragment的方方面面

abcijkxyz
 abcijkxyz
发布于 2016/07/30 17:23
字数 1026
阅读 6
收藏 1
点赞 0
评论 0

简介

    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);

本文转载自:http://blog.csdn.net/wdong_love_cl/article/details/51569440

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
安卓组件控件

ExpandableListView一点点 学习ExpandableListView简单用法 FloatingDragButton:炫酷的拖拽浮动按钮 IOS的Assistive Touch效果很炫酷,可以任意拖拽,同时点击后会展开菜单栏。然而,这不只...

掘金官方
2017/12/15
0
0
app包中的fragment和v4包中的fragment的使用的区别

转自 http://blog.csdn.net/a465456465/article/details/10415211 app包中的fragment和v4包中的fragment的使用的区别 1、尽量不要用app包中的fragment,因为这个是在3.0之后才有的,支持的版...

巴顿
2014/05/27
0
0
Android之Fragment

目录: 一. Fragment的生命周期 二.静态加载Fragment 三.动态加载Fragment <用的V4包> 四.Activity向Fragment通信 五.Fragment向Activity通信 六.Fragment中更新activity中的ui组件 七.Frag...

我家的猫跳楼了
2015/09/09
20
0
Android Fragment---设计理念

Android在Android3.0中引入了Fragment,主要用于支持在大屏幕上进行更多的动态和灵活的UI设计,如平板电脑。因为平板电脑的屏幕比手持设备要大,因此有更多的空间用于UI组件的组合和互换。F...

长平狐
2012/10/16
274
0
Fragment实战使用之—— 一个activity管理多个fragment

Fragment相信大家并不陌生了,3.0后出来的碎片。但是听得多不代表用得也多,尤其用fragment替代activity的使用。 如果大家想对Fragment有一个详细的了解可以阅读这篇文章Android Fragment完全...

veidy
2015/03/23
0
3
TabLayout+ViewPager+Fragment实现页面切换(菜单底部或顶部)

父布局 使用 使用Tab自带的设置文字图片 适配器 fragment使用 关于切换事件的监听 其他小细节 1.talayout去掉下标 app:tabIndicatorHeight="0dp" 2.关于加载fragment时重复加载的问题,设置v...

东西南瓜西葫芦
2016/07/16
80
0
一起Talk Android吧(第五十五回:Android中的Fragment显示与隐藏二)

各位看官们,大家好,上一回中咱们说的是Android中Fragment的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,我们在上一回中介绍了Fragment的显示与...

android开发
2017/12/22
0
0
使用fragment来实现屏幕部分界面的切换

前些天写一个程序,是关于通过点击屏幕一侧的不同按钮对屏幕另一侧的界面进行切换的。通过学习学到了关于fragment的应用。和大家分享一下。希望能帮助那些和我一样的菜鸟。 1:关于简单的fra...

决定的温度
2013/08/02
2.7K
3
关于FragmentActivity中调用fragment中方法

private void initFragment() { mRecommendFragment = new RecommendFragment();mInvestFragment = new InvestFragment();mClassRoomFragment = new ClassRoomFragment();mMineFragment = ne......

钓伯乐
2016/03/23
0
0
Android Fragment 实例

Fragment是Android honeycomb 3.0新增的概念,在Android——Fragment介绍、Android Fragment使用、Android FragmentManage FragmentTransaction介绍中做了关于Fragment的详细介绍。这一片主要...

鉴客
2011/12/12
39K
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PostgresSQL 查看当前schema下所有的函数/存储过程

selectroutine_name from information_schema.routineswhere routine_catalog = 'YourDBName'and routine_schema = 'YourSchemaName'order by routine_name;...

Leyxiao
3分钟前
0
0
去除bootstrapValidator 的校验结果

$("#form").data('bootstrapValidator').destroy();//会报没有这个方法,很奇怪 $('#form').data('bootstrapValidator',null); $('#form').bootstrapValidator();...

暗中观察
5分钟前
0
0
java环境安装

1、首先下载jdk安装包,一般去官网,官网需要登录才可以下载。 2、下载完成双击运行,想改路径改下路径,比较简单。安装jdk安装完,会弹出个窗口,提示开始安装jre的位置,我这里窗口比较奇葩...

朝如青丝暮成雪
6分钟前
0
0
Linux Command

Copy with progress rsync -r --progress source dest

Lyle_W
7分钟前
0
0
个灯数据营销,帮你找回被浪费的广告费

近日,个灯受邀出席被喻为广告营销业界的年度盛会——第八届梅花网传播业大展北京站的活动。 在展会上,个灯总经理严雯婷女士带来了《数据增能,营销智能》的主题演讲,以理论与实践相结合的...

个推
9分钟前
0
0
java的反射机制理解

一、概念说明 java的反射机制,是在运行状态下,可以动态获取任意一个类的属性和方法;可以动态调用一个对象任意方法; 二、反射相关类 java.lang.Class; //类 java.lang.re...

盼望明天
13分钟前
0
0
nginx反向代理-多端口映射

代码解释 1.1 http:www.baidu.test.com默认是80,访问“/”利用反向代理,然后访问本地8083; 1.2 8083代表本地的前端工程访问地址,前端需要访问后台数据,”/”,继续代理到后台地址9803; ...

lilugirl
14分钟前
0
0
Jfinal使用log4j2打印日志

1,添加maven配置 <properties><log4j2.version>2.11.0</log4j2.version><slf4j.version>1.7.25</slf4j.version></properties> <!--slf4j及log4j2日志 --><dependency> ......

iborder
15分钟前
0
0
如何在Rancher 2.0上快速部署Datadog

Datadog是一种流行的托管监控解决方案,用于聚合和分析分布式系统的指标和事件。从基础架构集成到协作仪表板,Datadog为用户提供了一个简洁的单一窗格视图,用户可以快速查看对其最重要的信息...

RancherLabs
18分钟前
0
0
Java示例演示Functor 和monad

This article was initially an appendix in our Reactive Programming with RxJavabook. However introduction to monads, albeit very much related to reactive programming, didn't suit......

Quan全
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部