关于Fragment的方方面面

简介

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

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
为什么要使用多线程下载呢? 究其原因就一个字:"快",使用多线程下载的速度远比单线程的下载速度要快,说到下载速度,决定下载速度的因素一般有两个: 一个是客户端实际的网速,另一个则是服务端的带宽。我们经常使用的是单线程下载,也就是下载一个文件就是开启一个线程去请求下载资源。 这里我们不考虑客户端实际网速因素,因为这个因素多变,不好控制。我们主要考虑的因素就是服务端的带宽。那么服务端是如何给每个客户端分配 它的下载带宽的呢???它分配的原理大致是这样的,服务端只会给请求它的每个线程平均分配相应的下载带宽,这也

androidAPP 集成微信支付 - 2016-06-02 14:06:01

最近项目里面需要支付功能,boos一致决定用微信支付,所以在网上查了很多资料,说的不全,完了就找以前的同事指教。算是成功集成上去了。在这里做个总结记录。 1、在APP上集成微信支付,首先当然是当官网上去注册并获取到支付功能。这些不涉及到开发,官网上说的很详细,这里就不多做文章。获取到这些能力了就为开发提供了条件了。开发中会用到的就是平台给的APPID、APPsercet、以及商户平台上设置的APP_key。 2、具备了支付能力等前提条件之后,就是开发过程了。代码里面怎么才能吊起支付了,参照官网上的DEMO

【Android】RecyclerView详解(一) - 2016-06-02 14:06:46

1.介绍 RecyclerView是比 ListView 更高级且更具灵活性的组件。 此组件是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效的滚动操作。 如果您有数据集合,其中的元素将因用户操作或网络事件而发生改变,请使用 RecyclerView 小组件。 RecyclerView使用起来很方便因为它: 提供了一种插拔式的体验,高度的解耦,异常的灵活使用; 显示的样式更丰富包括水平,竖直,Grid,瀑布显示方式; 可以通过ItemDecoration自定义Item间的间隔 ; 可以通
修改子弹类: public class Bullet { //子弹图片资源 public Bitmap bmpBullet; //子弹的坐标 public int bulletX, bulletY; //子弹的速度 public int speed; //子弹的种类以及常量 public int bulletType; //主角的 public static final int BULLET_PLAYER = - 1 ; //鸭子的 public static final int BULLET_DUCK
先来点鸡汤: Stay hungry,stay foolish 这句话的的解读:我们必须了解自己的渺小。如果我们不学习,科技发展的速度会让我们五年后被清空。所以,我们必须用初学者谦虚的自觉,饥饿者渴望的求知态度,来拥抱未来的知识。 这几天做的项目中需要从图库选择图片或者拍照生成图片,然后展现在IamgeView控件上。当然,从图库选择图片和拍照选择图片的功能实现起来很简单。直接写上代码: CharSequence[] items = { "拍照" , "图库" }; new AlertDialog.Bui
尊重博主原创,如需转载,请附上本文链接 http://blog.csdn.net/chivalrousman/article/details/51553114#t16 为什么关注性能 对于一款APP,用户首先关注的是 app的性能,而不是APP本身的属性功能,用户不关心你是否是搞社交,是否搞电商,是否是一款强大的美图滤镜app,用户首先关注的是 性能—- 性能不好 ,用户会直接卸载,在应用市场给一个恶狠狠得差评,小则影响产品口碑,大则影响公司的品牌和声誉,作为程序员,app的性能更应该作为我们关注的一个功
跟上之前的两篇文章 Android属性动画ValueAnimator源码简单分析 Android属性动画ObjectAnimator源码简单分析 继续看AnimatorSet源码的大概过程。 AnimatorSet 提供了一种把多个动画放到一起,按照某种特定的顺序来播放,比如一个接一个的播放或者多个动画一起播放。 AnimatorSet简单使用随便举一个最简单的例子 //AnimatorSet AnimatorSet animSet = new AnimatorSet(); ObjectAnimator
OpenglES2.0 for Android:来画个矩形吧 上一节中我们绘制了一个三角形,我们在上一节的基础上来完成矩形的绘制 。 OK,开始动手做吧,首先在上一节的项目中的shape目录下新建一个类——Square (Square.java),然后定义矩形的四个顶点的坐标,此时代码如下(Square.java): spanpackage com.cumt.shape;public class Square {//float类型的字节数private static final int BYTES_PER
第4节 Button 按钮是需要与用户进行互动的控件。 Button 继承自 TextView ,凡是 TextView 有的特定,它都有。 public class Button extends TextView { ......} 4.1 与 TextView 的不同 Button 是使用了特别style的 TextView 。在 Button 创建的过程中,它使用了一个系统内部的style, public Button (Context context, AttributeSet attrs) {
Calendar Provider是一个用于提供用户标记在日历上事件的数据仓库。Calendar Provider 的API提供了包括增删改查在内的一系列操作日历事件的方法。 您可以在自己的应用程序或Adapter中使用Calendar Provider 的API。Adapter的相关用法将在本文的最后介绍。 通常来说,要访问日历应用程序中的数据,需要您在manifest中声明权限;为了简化操作, Calendar Provider 提供了一系列的Intents,使用这些Intents可以方便添加、查看、