浅谈Android app开发中Fragment的Transaction操作

在Android中,对Fragment的操作都是通过FragmentTransaction来执行。而从Fragment的结果来看,FragmentTransaction中对Fragment的操作大致可以分为两类:

显示:add() replace() show() attach()
隐藏:remove() hide() detach()
对于每一组方法,虽然最后产生的效果类似,但方法背后带来的副作用以及对Fragment的生命周期的影响都不尽相同。

add() vs. replace()
只有在Fragment数量大于等于2的时候,调用add()还是replace()的区别才能体现出来。当通过add()连续两次添加Fragment的时候,每个Fragment生命周期中的onAttach()-onResume()都会被各调用一次,而且两个Fragment的View会被同时attach到containerView。

同样,退出Activty时,每个Fragment生命周期中的onPause()-onDetach()也会被各调用一次。

但当使用replace()来添加Fragment的时候,第二次添加会导致第一个Fragment被销毁,即执行第二个Fragment的onAttach()方法之前会先执行第一个Fragment的onPause()-onDetach()方法,同时containerView会detach第一个Fragment的View。

show() & hide() vs. attach() & detach()
调用show() & hide()方法时,Fragment的生命周期方法并不会被执行,仅仅是Fragment的View被显示或者​隐藏。而且,尽管Fragment的View被隐藏,但它在父布局中并未被detach,仍然是作为containerView的childView存在着。相比较下,attach() & detach()做的就更彻底一些。一旦一个Fragment被detach(),它的onPause()-onDestroyView()周期都会被执行。

同时Fragment的View也会被detach。在重新调用attach()后,onCreateView()-onResume()周期也会被再次执行。

remove()
其实看完上面的分析,remove()方法基本也就明白了。相对应add()方法执行onAttach()-onResume()的生命周期,remove()就是完成剩下的onPause()-onDetach()周期。

错误

曾经在FragmentTransaction编写时遇到过以下错误:

复制代码 代码如下:

The method replace(int, Fragment) in the type FragmentTransaction is not applicable for the arguments (int, MyFragment)

Fragment newfragment =new MyFragment();
fragmentTransaction.replace(R.layout.activity_main,newfragment ).commit();

提示错误:The method replace(int, Fragment) in the type FragmentTransaction is not applicable for the arguments (int, MyFragment)

原因找了好久!一直以为子类对象不能赋值给父类引用。这不科学啊!

代码时这样的:

package com.example.testforfragment;

import android.os.Bundle;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v4.app.Fragment;
import android.support.v4.app.Fragment.*;
import android.view.Menu;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  Fragment newfragment =new MyFragment();
  fragmentTransaction.replace(R.layout.activity_main,newfragment ).commit();
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

所以关键就在于:

Fragment newfragment =new MyFragment();
fragmentTransaction.replace(R.layout.activity_main,newfragment ).commit();

修改后:

package com.example.testforfragment;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;

public class MainActivity extends FragmentActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  FragmentManager fragmentManager = getSupportFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  Fragment newfragment =new MyFragment();
  fragmentTransaction.replace(R.layout.activity_main,newfragment ).commit();
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}
时间: 2016-02-22

Android App在ViewPager中使用Fragment的实例讲解

据说Android最推荐的是在ViewPager中使用FragMent,即ViewPager中的页面不像前面那样用LayoutInflater直接从布局文件加载,而是一个个Fragment.注意这里的Fragment 是android.support.v4.view包里的Fragment,而不是android.app包里的Fragment. 使用v4包里的Fragment的Activity必须继承自FragmentActivity. 其实使用Fragment与前面不使用Fragment非常类似:

Android App中使用ListFragment的实例教程

ListFragment继承于Fragment.因此它具有Fragment的特性,能够作为activity中的一部分,目的也是为了使页面设计更加灵活. 相比Fragment,ListFragment的内容是以列表(list)的形式显示的.ListFragment的布局默认包含一个ListView.因此,在ListFragment对应的布局文件中,必须指定一个 android:id 为 "@android:id/list" 的ListView控件! ListFragment基础使用 下面

Android的Fragment的生命周期各状态和回调函数使用

回调函数 就像activities一样,fragments也有它们自己的生命周期.理解fragments的生命周期,可以使你在它们被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态. 流程: onAttach() 作用:fragment已经关联到activity, 这个是 回调函数 @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.i("onAttach_

Android App中使用ViewPager+Fragment实现滑动切换效果

在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar.细节无法控制.不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包.那我们就也采用viewpager来做滑动吧.另外一个概念就是Fragment和FragmentActivit

Android应用开发中Fragment与Activity间通信示例讲解

首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.jar这个包 然后你写的activity不能再继承自Activity类了,而是要继承android.support.v4.app.FragmentActivity,一些其他的父类也有相应的变化. 由于在android的实现机制中fragment和activity会被分别实例化为两个不相干的对象,他们之间的联系由activity的一个成员对象fragmentmanager来维护.fr

Android中使用TabHost 与 Fragment 制作页面切换效果

三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义页面切换的效果:切换页面时,当前页面滑出,目标页面滑入.这是2个不同的动画设定动画时要区分对待 import android.content.Context; import android.util.AttributeSet; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import

Android中ViewPager实现滑动指示条及与Fragment的配合

自主实现滑动指示条 先上效果图: 1.XML布局 布局代码如下: <LinearLayout 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

Android app开发中的Fragment入门学习教程

在Android3.0上开始引入了一个新概念叫Fragment.它有自己的布局文件,可以作为组件排布,也可以相互组合去实现不同的布局显示.使用Fragment可以重复利用代码,并且可以满足不同设备尺寸的需求.Fragment不能单独存在,只能存在于Activity中,而一个Activity可以拥有多个Fragment.很重要的一点是,Fragment可以和Activity中的其它组件一起使用,无需重写所有Activity的接口.所以使用Fragment就可以这样来完成上例中"主界面-详细界面&q

浅谈Android App开发中Fragment的创建与生命周期

Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment.你可以把Fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影响.例如:当activity暂停时

Android应用开发中Fragment间通信的实现教程

为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让fragment的自包含和模块化.一旦你定义了这些可重用的Fragment,你可以通过Activity将它们关联起来并通过程序的逻辑代码将他们连接起来以实现整体组合的UI. 你会经常想要一个fragment与另一个fragment通信,例如基于用户事件改变fragment中的内容.所有fragment质检单额通信都是通过Activity关联起来的.两个fragment之间不应该直接进行通

Android应用开发中Fragment存储功能的基本用法

一.引言 在移动应用程序的架构设计中,界面与数据即不可分割又不可混淆.在绝大部分的开发经历中,我们都是使用Fragment来进行界面编程,即使保存数据基本上也只是界面相关控件的数据,很少做其他的数据保存,毕竟这样与开发原则相背,而今天这一篇博客就要来介绍一下Fragment的另类用法,只是用来保存数据而没有任何界面元素. 二.实现背景 对于Fragment的数据保存方法,不难想到还是与setRetainInstance有关系的.这样一来所处的背景也是在屏幕旋转或其他配置改变时需要用到.无论在开发

Android应用开发中Fragment的静态加载与动态加载实例

1.Fragment的静态使用 Fragment是作为Activity的UI的一部分,它内嵌在Activity中,多个Fragment可以把一个Activity分成多个部分,这在大屏幕手机或者平板电脑中会比较多的用到,这样就不用使用多个Activity来切换这么麻烦了.当然Fragment也可以不显示,只在后台处理一些数据,这篇文章中就暂时不谈到这个.以下来看怎么静态地在Activity的布局文件中添加Fragment. 自定义的Fragment通常要继承Fragment这个类,也有一些特殊的是

实例讲解Android应用开发中Fragment生命周期的控制

一.Fragment的生命周期初探 因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的. 如果Activity是暂停状态,其中所有的Fragment都是暂停状态:如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动:如果Activity被销毁,那么它其中的所有Fragment都会被销毁. 但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除F

Android应用开发中Action bar编写的入门教程

从Android 3.0开始除了我们重点讲解的Fragment外,Action Bar也是一个重要的内容,Action Bar主要是用于代替传统的标题栏,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控. Action Bar主要功能包含: 1. 显示选项菜单 2. 提供标签页的切换方式的导航功能,可以切换多个fragment. 3. 提供下拉的导航条目. 4. 提供交互式活动视图代替选项条目 5. 使用程序的图标作为返回Home主屏或

Android App开发中ViewPager组件的入门使用教程

首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能.下篇再仔细讲讲为什么要这么写. 效果图: 实现了三个view间的相互滑动 第一个VIEW向第二个VIEW滑动: 第二个VIEW向第三个VIEW滑动: 一.新建项目,引入ViewPager控件 ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换. 1.在主布局文件里加入 <RelativeLayout xmlns:android="http://schem

Android应用开发中控制反转IoC设计模式使用教程

1.概述 首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量,那么你就new 出来用呗~~ IoC的原则是:NO,我们不要new,这样耦合度太高:你配置个xml文件,里面标明哪个类,里面用了哪些成员变量,等待加载这个类的时候,我帮你注入(new)进去: 这样做有什么好处呢?  回答这个问题,刚好可以回答另一个问题,很多人问,项目分层开发是吧,分为控制层.业务层